L'applicazione Pannello dei filtri comprende un gruppo di classi: una per ognuno dei filtri disponibili; queste classi vengono utilizzate dai singoli pannelli per creare i filtri. Quando un utente seleziona un filtro, il codice ActionScript associato al pannello del filtro crea un'istanza corrispondente alla classe filter factory appropriata (queste classi vengono dette
classi factory
perché il loro scopo è quello di creare istanze di altri oggetti, proprio come una fabbrica crea singoli prodotti).
Ogni qualvolta l'utente cambia un valore di proprietà nel pannello, il codice del pannello chiama il metodo appropriato nella classe factory. Ogni classe factory comprende metodi specifici che il pannello utilizza per creare l'istanza appropriata per il filtro. Se, ad esempio, l'utente seleziona il filtro Sfocatura, l'applicazione crea l'istanza BlurFactory. La classe BlurFactory include un metodo
modifyFilter()
che accetta tre parametri:
blurX
,
blurY
e
quality
, che vengono utilizzati insieme per creare l'istanza BlurFilter desiderata:
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));
}
Se invece l'utente seleziona il filtro Convoluzione, poiché questo filtro è molto più flessibile le proprietà da controllare sono molte di più. Nella classe relativa a questo filtro chiamata ConvolutionFactory, quando l'utente seleziona un diverso valore sul pannello del filtro viene chiamato il seguente codice:
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));
}
Notate che ogni volta che i valori del filtro vengono cambiati, l'oggetto factory invia un evento
Event.CHANGE
per notificare ai listener che i valori del filtro sono cambiati. La classe FilterWorkbenchController, il cui compito è quello di applicare i filtri ai contenuti filtrati, “ascolta” tali eventi per verificare quando è necessario recuperare una nuova copia del filtro e applicarlo nuovamente al contenuto filtrato.
La classe FilterWorkbenchController non ha bisogno di conoscere i dettagli specifici di ogni classe filter factory: deve solo ricevere notifica del cambiamento dei parametri del filtro ed essere in grado di accedere a una copia del filtro. Per fare questo, l'applicazione include un'interfaccia, IFilterFactory, che definisce il comportamento che una classe filter factory deve assumere in modo che l'istanza dell'applicazione FilterWorkbenchController possa svolgere questo compito. IFilterFactory definisce il metodo
getFilter()
che viene usato nella classe FilterWorkbenchController:
function getFilter():BitmapFilter;
Notate che la definizione del metodo di interfaccia
getFilter()
restituisce un'istanza BitmapFilter e non uno specifico tipo di filtro. La classe BitmapFilter non definisce uno specifico tipo di filtro. BitmapFilter è, piuttosto, una classe base sulla quale tutte le classi dei filtri sono costruite. Ogni classe filter factory definisce una specifica implementazione del metodo
getFilter()
in cui restituisce un riferimento all'oggetto filtro che ha costruito. Di seguito viene riportata, a scopo di esempio, una versione abbreviata del codice sorgente della classe ConvolutionFactory:
public class ConvolutionFactory extends EventDispatcher implements IFilterFactory
{
// ------- Private vars -------
private var _filter:ConvolutionFilter;
...
// ------- IFilterFactory implementation -------
public function getFilter():BitmapFilter
{
return _filter;
}
...
}
Nell'implementazione della classe ConvolutionFactory del metodo
getFilter()
, viene restituita un'istanza ConvolutionFilter, sebbene gli oggetti che chiamano
getFilter()
non ne siano necessariamente a conoscenza: secondo la definizione del metodo
getFilter()
seguito da ConvolutionFactory, esso deve restituire qualsiasi istanza BitmapFilter, la quale a sua volta può essere un'istanza di qualsiasi classe del filtro ActionScript.