「濾鏡工作台」應用程式內含一組類別,每個可用的濾鏡都有一個類別,可由個別的面板用來建立濾鏡。當使用者選取濾鏡時,與濾鏡面板關聯的 ActionScript 程式碼會建立適當 filter factory 類別的實體 (這些類別稱為「factory 類別」,由於其目的是要建立其它物件的實體,因此就像是在現實世界中製造個別產品的工廠)。
每當使用者變更面板上的屬性值時,面板的程式碼便會呼叫 factory 類別內適當的方法。每個 factory 類別都內含特定的方法,可讓面板用來建立適當的濾鏡實體。例如,如果使用者選取了「模糊」濾鏡,應用程式便會建立一個 BlurFactory 實體。BlurFactory 類別包含一個可接受三個參數的
modifyFilter()
方法:
blurX
、
blurY
和
quality
,這三個參數都會用來建立所需的 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));
}
請注意,在各種情況下,變更濾鏡值時,factory 物件便會傳送一個
Event.CHANGE
事件,以通知偵聽程式該濾鏡的值已變更。FilterWorkbenchController 類別會實際執行將濾鏡套用至已套用濾鏡之內容的工作,並偵聽該事件,以查明何時需要擷取新的濾鏡副本,並重新將濾鏡套用至已套用濾鏡的內容上。
FilterWorkbenchController 類別不需要知道每個 filter factory 類別的特殊細節;它只需要知道濾鏡已變更,並且能夠存取濾鏡的副本即可。為了支援此動作,應用程式包含了一個介面 (即 IFilterFactory),該介面會定義 filter factory 類別需要提供的行為,因此應用程式的 FilterWorkbenchController 實體便可以執行其工作。IFilterFactory 定義了
getFilter()
方法,可在 FilterWorkbenchController 類別內使用:
function getFilter():BitmapFilter;
請注意,
getFilter()
介面方法定義會指定其傳回 BitmapFilter 實體,而非特定的濾鏡類型。BitmapFilter 類別不會定義特定的濾鏡類型。因此,BitmapFilter 是建立所有濾鏡類別的基底類別。每個 filter factory 類別都會定義一個特定的
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()
方法之定義來看,它必須傳回任何 BitmapFilter 實體,該實體可以是 ActionScript 的任何濾鏡類別)。