Filter Workbench 응용 프로그램에는 사용할 수 있는 필터별로 하나씩 지정된 클래스 집합이 포함되어 있는데 개별 패널은 이러한 클래스를 사용하여 필터를 만듭니다. 사용자가 필터를 선택하면 필터 패널과 연결된 ActionScript 코드에서는 해당하는 필터 팩토리 클래스의 인스턴스를 만듭니다. (이러한 클래스는 실제 팩토리에서 개별 제품을 만드는 것처럼 다른 객체의 인스턴스를 만들므로
팩토리 클래스
라고 불립니다.)
사용자가 패널에서 속성 값을 변경할 때마다 패널의 코드는 팩토리 클래스의 해당하는 메서드를 호출합니다. 각 팩토리 클래스에는 패널이 적절한 필터 인스턴스를 만들 때 사용하는 특정 메서드가 포함되어 있습니다. 예를 들어 사용자가 [흐림] 필터를 선택하는 경우 응용 프로그램은 BlurFactory 인스턴스를 만듭니다. BlurFactory 클래스에는
blurX
,
blurY
및
quality
라는 세 개의 매개 변수를 사용하는
modifyFilter()
메서드가 있는데 이 매개 변수는 원하는 BlurFilter 인스턴스를 만드는 데 함께 사용됩니다.
private var _filter:BlurFilter;
public function modifyFilter(blurX:Number = 4, blurY:Number = 4, quality:int = 1):void
{
_filter = new BlurFilter(blurX, blurY, quality);
dispatchEvent(new Event(Event.CHANGE));
}
반면 사용자가 유연성이 훨씬 더 높은 [회선] 필터를 선택하는 경우 제어할 수 있는 속성 집합은 더 커지게 됩니다. 사용자가 필터 패널에서 다른 값을 선택하면 ConvolutionFactory 클래스에서 다음 코드가 호출됩니다.
private var _filter:ConvolutionFilter;
public function modifyFilter(matrixX:Number = 0,
matrixY:Number = 0,
matrix:Array = null,
divisor:Number = 1.0,
bias:Number = 0.0,
preserveAlpha:Boolean = true,
clamp:Boolean = true,
color:uint = 0,
alpha:Number = 0.0):void
{
_filter = new ConvolutionFilter(matrixX, matrixY, matrix, divisor, bias, preserveAlpha, clamp, color, alpha);
dispatchEvent(new Event(Event.CHANGE));
}
각각의 경우에 필터 값이 변경되면 팩토리 객체는
Event.CHANGE
이벤트를 전달하여 리스너에게 필터 값이 변경되었음을 알립니다. 필터링된 내용에 필터를 실제로 적용하는 작업을 수행하는 FilterWorkbenchController 클래스는 필터의 새 복사본을 검색하여 필터링된 내용에 다시 적용해야 할 시기를 확인하기 위해 이벤트를 수신 대기합니다.
FilterWorkbenchController 클래스는 각 필터 팩토리 클래스의 자세한 내용을 알 필요가 없으며 단지 필터가 변경되었음을 알고 필터의 복사본에 액세스할 수만 있으면 됩니다. 이를 위해 응용 프로그램에는 응용 프로그램의 FilterWorkbenchController 인스턴스가 작업을 수행할 수 있도록 필터 팩토리 클래스에서 제공해야 하는 비헤이비어를 정의하는 IFilterFactory 인터페이스가 포함되어 있습니다. IFilterFactory는 FilterWorkbenchController 클래스에서 사용되는
getFilter()
메서드를 정의합니다.
function getFilter():BitmapFilter;
getFilter()
인터페이스 메서드 정의에는 특정 유형의 필터가 아니라 BitmapFilter 인스턴스가 반환되도록 지정되어 있습니다. BitmapFilter 클래스는 특정 유형의 필터를 정의하지 않습니다. BitmapFilter는 모든 필터 클래스의 기본 클래스입니다. 각 필터 팩토리 클래스는 자신이 작성한 필터 객체에 대한 참조를 반환하는
getFilter()
메서드의 특정 구현을 정의합니다. 예를 들어 다음은 ConvolutionFactory 클래스 소스 코드의 단축된 버전입니다.
public class ConvolutionFactory extends EventDispatcher implements IFilterFactory
{
// ------- Private vars -------
private var _filter:ConvolutionFilter;
...
// ------- IFilterFactory implementation -------
public function getFilter():BitmapFilter
{
return _filter;
}
...
}
ConvolutionFactory 클래스가 구현하는
getFilter()
메서드는 ConvolutionFilter 인스턴스를 반환하는데,
getFilter()
를 호출하는 객체는 이런 사실을 알 필요가 없습니다. ConvolutionFactory가 따르는
getFilter()
메서드의 정의에 따르면 이 메서드는 모든 ActionScript 필터 클래스의 인스턴스가 될 수 있는 BitmapFilter 인스턴스를 반환해야 합니다.