I Filter Workbench finns en uppsättning klasser, en för varje tillgängligt filter. Klasserna används på de olika panelerna för att skapa filtren. När en användare väljer ett filter skapas en instans av filterfabriksklassen av den ActionScript-kod som är kopplad till den filterpanelen. (Klasserna kallas
fabriksklasser
eftersom deras syfte är att skapa instanser av andra objekt, på ungefär samma sätt som en fabrik skapar enskilda produkter.)
Varje gång en användare ändrar ett egenskapsvärde på panelen anropas motsvarande metod i fabriksklassen av panelkoden. Varje fabriksklass innehåller specifika metoder som används av panelen för att skapa motsvarande filterinstans. Om användaren till exempel väljer oskärpefiltret skapas en BlurFactory-instans. I klassen BlurFactory finns metoden
modifyFilter()
som tar tre parametrar:
blurX
,
blurY
och
quality
. Tillsammans används de för att skapa BlurFilter-instansen:
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));
}
Om användaren i stället väljer faltningsfiltret, får han eller hon ett filter med mycket större flexibilitet och därmed fler egenskaper att ställa in. I klassen ConvolutionFactory anropas följande kod när användaren väljer ett annat värde på filterpanelen:
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));
}
Observera, att varje gång filtervärdena ändras, skickas en
Event.CHANGE
-händelse för att meddela avlyssnarna att filtrets värden har ändrats. Klassen FilterWorkbenchController, som är den klass som faktiskt tillämpar filtren på det filtrerade innehållet, avlyssnar den händelsen för att veta när den ska hämta en ny version av filtret och tillämpa den på det filtrerade innehållet.
Klassen FilterWorkbenchController behöver inte de specifika detaljerna i varje filterfabriksklass. Den behöver bara veta att filtret har ändrats och kunna komma åt en kopia av filtret. För att detta ska fungera innehåller programmet ett gränssnitt, IFilterFactory, som definierar vilket beteende en filterfabriksklass behöver ha för att programmets FilterWorkbenchController-instans ska kunna utföra sin uppgift. IFilterFactory definierar den
getFilter
()-metod som används i klassen FilterWorkbenchController:
function getFilter():BitmapFilter;
Observera att gränssnittsmetoden
getFilter()
definierar att den returnerar en BitmapFilter-instans och inte en viss typ av filter. Klassen BitmapFilter definierar inte en viss typ av filter. I stället är den en basklass som alla filterklasser bygger på. Varje filterfabriksklass definierar en viss implementering av metoden
getFilter()
. I den returneras en referens till filterobjektet som skapats av filterfabriksklassen. Här följer till exempel en förkortad version av källkoden för klassen ConvolutionFactory:
public class ConvolutionFactory extends EventDispatcher implements IFilterFactory
{
// ------- Private vars -------
private var _filter:ConvolutionFilter;
...
// ------- IFilterFactory implementation -------
public function getFilter():BitmapFilter
{
return _filter;
}
...
}
I klassen ConvolutionFactorys implementering av metoden
getFilter()
returneras en ConvolutionFilter-instans, med det registreras inte nödvändigtvis av alla objekt som anropar
getFilter()
. Enligt den definition av metoden
getFilter()
som ConvolutionFactory följer måste alla BitmapFilter-instanser returneras. Det kan vara en instans av vilken som helst av ActionScript-filterklasserna.