Aug 20

Antes de mostrar como é o sistema de eventos no ActionScript 3, gostaria de falar um pouco sobre a necessidade do Padrão Observer num software.

O Padrão Observer foi desenvolvido para suprir a dependência um-para-muitos entre objetos de modo que quando acontece algo, todos os dependentes de um certo objeto são notificados do ocorrido. Suponha que temos um sistema de gerenciamento de um supermercado e existe vários sub-gerenciamentos, como estoque, preferências dos clientes, etc.

Quando é efetuado uma compra, o sistema de gerenciamento principal dispara um evento “avisando” que foi efetuado uma compra. Os ouvintes, vulgo listeners, que são os pequenos sistemas de sub-gerenciamento, recebem esse aviso e a informação é processada de acordo com os interesses de cada dependente.

A fim de resolver esse problema de forma limpa utilizando as boas práticas de programção orientada a objetos, usa-se o Padrão Observer. Vamos lá por a mão na massa!

Bem, a imagem representa a UML de como o sistema em si funcionará. Temos um despachador de eventos (Event dispatcher), objetos resultantes dos eventos (Event object) e por último os ouvintes (Listeners) que são os objetos que escutarão o despachador. A estrutura é fácil de ser interpretada como vocês veêm. Vamos construir então os objetos.

Dispatcher:

// DispatcherObject.as
 
package net.vitoravelino.observer {
    import flash.events.EventDispatcher;
    import flash.events.Event;
 
    public class DispatcherObject extends EventDispatcher {
        public function DispatcherObject() {
        }
 
        public function dispatch():void {
            this.dispatchEvent(new Event("testEvent"));
        }
    }
}

Código que representa o objeto que vai ser responsável por despachar o evento para todos os listeners cadastrados no mesmo. A função do DispatcherObject é observar o que acontece ao seu redor e caso aconteça algo, ele despache para quem o escuta (listeners).

Listener:

// ListenerObject.as
 
package net.vitoravelino.observer {
    import flash.events.IEventDispatcher;
    import flash.events.Event;
 
    public class ListenerObject {
        public function ListenerObject(dispatcher:IEventDispatcher) {
            this.addDispatcher(dispatcher);
        }
 
        private function addDispatcher(dispatcher:IEventDispatcher):void {
            dispatcher.addEventListener("testEvent", testEventHandler);
        }
 
        private function testEventHandler(evt:Event):void {
            trace("Event arrived from " + evt.target.toString());
        }
    }
}

Código que representa o objeto que vai ser responsável por receber os eventos vindo do DispatcherObject. No método construtor é passado o dispatcher, nesse caso DispatcherObject, e o listener já irá cadastrar-se nele chamando o método addDispatcher.

Observe que só é utilizado nas classes acima um só evento, porém é possível disparar vários eventos no método dispatch de DispatcherObject e existirem vários listeners que também podem escutar a vários eventos distintos. Como uma boa prática de programação é recomendado que crie-se uma interface para os listeners e daí cada um implementa-a do seu modo.

Para uma melhor compreensão de como isso ocorre, abaixo temos um exemplo simples de como tudo isso funciona:

Main:

// Main.as
 
package net.vitoravelino {
    import net.vitoravelino.observer.DispatcherObject;
    import net.vitoravelino.observer.ListenerObject;
 
    public class Main {
        public function Main() {
            var dispatcher:DispatcherObject = new DispatcherObject();
            var listener1:ListenerObject = new ListenerObject(dispatcher);
            var listener2:ListenerObject = new ListenerObject(dispatcher);
 
            dispatcher.dispatch();
        }
    }
}

O que acontece acima é o seguinte: é instanciado um dispatcher (observer) e dois listeners; os dois listeners cadastram-se no dispatcher; e em seguida o dispatcher dispara o evento que será capturados pelos listeners cadastrados no mesmo.

Espero que tenha conseguido deixar claro como funciona o Padrão Observer em ActionScript 3. Como diria meu colega Vedovelli, ActionScript é também uma linguagem orientada a eventos e se soubermos tirar proveito disso, o código ficará mais limpo e desacoplado. Quem não entendeu muito bem como funciona o sistema de disparo e captura de eventos, recomendo o screencast feito pelo Vedovelli.

Como este é um dos primeiros tutoriais, estou aceitando sugestões para melhorias futuras nos próximos que estão por vir.

[]’s
Vítor Avelino

Base para o tutorial: http://www.communitymx.com/content/article.cfm?page=2&cid=76FDB


leave a reply