<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nuss... E Agora?!? &#187; Observer</title>
	<atom:link href="http://www.nusseagora.blog.br/tag/observer/feed" rel="self" type="application/rss+xml" />
	<link>http://www.nusseagora.blog.br</link>
	<description></description>
	<lastBuildDate>Fri, 04 Feb 2011 12:56:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.5</generator>
		<item>
		<title>Padrão de Projetos Observer: Implementando mísseis teleguiados – parte 3</title>
		<link>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-3</link>
		<comments>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-3#comments</comments>
		<pubDate>Tue, 22 Dec 2009 10:55:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Observer]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=866</guid>
		<description><![CDATA[Segue abaixo a 3a parte do artigo sobre o padrão de projetos Observer. Prá começar, aí está o Diagrama de Classes: Ele é simples como a estrutura do padrão: as classes que são observadoras implementam a interface IObserver, o sujeito observado implementa a ISubect que, por sua vez, tem um conjunto de IObservers. Aqui você [...]]]></description>
			<content:encoded><![CDATA[<p>Segue abaixo a 3a parte do artigo sobre o padrão de projetos Observer.</p>
<p><span id="more-866"></span>Prá começar, aí está o Diagrama de Classes:</p>
<p><img class="aligncenter size-full wp-image-867" title="diagrama-de-classe-observer" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/12/diagrama-de-classe-observer.jpg" alt="diagrama-de-classe-observer" width="400" height="582" /></p>
<p>Ele é simples como a estrutura do padrão: as classes que são observadoras implementam a interface <em>IObserver</em>, o sujeito observado implementa a <em>ISubect</em> que, por sua vez, tem um conjunto de <em>IObservers</em>.</p>
<p>Aqui você baixa o código do projeto CS3 em Actionscript 3.0  [download id="3"]</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-3/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Padrão de Projetos Observer: Implementando mísseis teleguiados – parte 2</title>
		<link>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-2</link>
		<comments>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-2#comments</comments>
		<pubDate>Sun, 29 Nov 2009 13:00:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Observer]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=839</guid>
		<description><![CDATA[Como prometido na 1ª parte do artigo sobre o padrão de projetos Observer, hoje vamos implementá-lo. O nosso escopo é bem simples: temos um jato que foge de mísseis teleguiados. Durante a perseguição, o jato deve poder mudar de direção e os mísseis devem responder a essa mudança adequadamente para não perderem seu alvo. Primeiramente, [...]]]></description>
			<content:encoded><![CDATA[<p>Como prometido na <a href="http://nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-1/" target="_self">1ª parte do artigo sobre o padrão de projetos Observer</a>, hoje vamos implementá-lo. O nosso escopo é bem simples: <strong>temos um jato que foge de mísseis teleguiados. Durante a perseguição, o jato deve poder mudar de direção e os mísseis devem responder a essa mudança adequadamente para não perderem seu alvo.</strong></p>
<p><strong><span id="more-839"></span></strong>Primeiramente, nossa implementação do Observer terá 2 interfaces:</p>
<p>-        <em>IObserver</em>, implementada por todos os observadores que devem responder às mudanças no Sujeito</p>
<p>-        <em>ISubject.</em> Implementada pelo Sujeito Observado.</p>
<p><em> </em></p>
<p>Trabalhar com essas interfaces simplifica muito a manutenção do código graças ao <a href="http://nusseagora.blog.br/principio-da-substituicao-de-liskov/" target="_blank">princípio da substituição de Liskov</a> como veremos no final do artigo. Por enquanto, continuaremos com a implementação.</p>
<p>Nossa interface <em>IObserver </em>terá somente o método <em>Atualizar(direcao:String):void. </em>Esse é o único método que todos os outros observadores do meu sistema deverão ter. <em>"E o que ele faz, Tiago?"</em> Esse é o método que atualiza a direção do Observador baseado na direção que o Sujeito Observado tomar em um dado instante.</p>
<pre class="brush:java">package Observer

{
	public interface IObserver
	{
		function Atualizar(direcao:String):void;
	}
}</pre>
<p>Nossos Sujeitos, porém, terão outras funcionalidades: <em>ISubject</em> deverá ter um método para registrar novos observadores e um outro para notificá-los sobre as mudanças de direção.</p>
<pre class="brush:java">package Observer

{
	import Observer.IObserver;

	public interface ISubject
	{
		function RegistrarObservador(observador:IObserver):void;
		function NotificarObservador():void;
	}
}</pre>
<p>Esse é nosso jato, um sujeito observado pelos mísseis teleguiados. Notem que, por ser um sujeito, ele obrigatoriamente deve implementar a interface <em>ISubject</em> que criamos e, consequentemente, também seus métodos.</p>
<pre class="brush:java">package Observer
{

	public class TJato implements ISubject
	{
		private var _observadores:Array;
		private var _direcao:String;

		public function TJato(direcao:String)
		{
		this._observadores = new Array();
		this._direcao = direcao;
		}

/***************************************************************

Adiciona um observador à coleção de observadores do sujeito  ...

... observado, para que ele possa notificá-los quando seu    ...

... estado mudar.

Por ser passado um objeto IObservador, TODA E QUALQUER...

... CLASSE pode se tornar um observador, desde que ...

... implemente a interface IObserver.

****************************************************************/

		public function RegistrarObservador(observador:IObserver):void
		{
			// Adiciono um observador à lista...
			this._observadores.push(observador);

			// ... e aviso a todo mundo quem foi registrado
			trace ("observador registrado: "+ observador);
		}

/***************************************************************

Varre a coleção de observadores, enviando à eles o novo estado.

... Utiliza a metodologia de empurrar dados observados.

****************************************************************/

		public function NotificarObservador():void
		{
			for(var i:int=0; i&lt;this._observadores.length; i++)
			this._observadores[i].Atualizar(this._direcao);
		}

/***************************************************************

Retorna a direção para onde o Jato está voando

****************************************************************/

		public function RetornarDirecao():String
		{
			return this._direcao;
		}

/***************************************************************

Modifica a direção do Jato para uma nova direção

****************************************************************/

		public function ModificarDirecao(direcao:String):void
		{
			this._direcao=direcao;
			this.NotificarObservador();
		}
	}
}</pre>
<p>O míssil terá somente esses 2 métodos. Note que eles são passivos, fazendo com que o funcionamento da classe dependenda exclusivamente do que é passado para ela.</p>
<pre class="brush:java">package Observer
{

	public class TMissil implements IObserver
	{
		private var _direcao:String;

		public function TMissil(direcao:String)
		{
			this._direcao = direcao;
		}

/***************************************************************
Atualiza a direção para onde o Míssil está indo
****************************************************************/

		public function Atualizar(direcao:String):void
		{
			this._direcao = direcao;
		}

/***************************************************************
Retorna a direção para onde o Míssil está voando
****************************************************************/

		public function RetornarDirecao():String
		{
			return this._direcao;
		}
	}
}</pre>
<p>Por fim, nossa classe principal, a TMain. Nela vamos realizar uma sequência de testes da funcionalidade do Observer.</p>
<pre class="brush:java">package
{
	import flash.display.MovieClip;
	import Observer.IObserver;
	import Observer.ISubject;
	import Observer.TJato;
	import Observer.TMissil;
	import Observer.THelicoptero;

	public class TMain extends MovieClip
	{
		private var _jato:TJato;
		private var _missil1:TMissil;
		private var _missil2:TMissil;

		private var _helicoptero:THelicoptero;

		public function TMain()
		{
			//Inicia a direção do Jato e dos mísseis
			this._jato = new TJato("CIMA");
			this._missil1 = new TMissil("BAIXO");
			this._missil2 = new TMissil("PARADO");

			//Exibe a direção dos objetos na tela
			trace( "Direção do jato: "
				  + this._jato.RetornarDirecao() );
			trace( "Direção do míssil 1: "
				  + this._missil1.RetornarDirecao() );
			trace( "Direção do míssil 2: "
				  + this._missil2.RetornarDirecao() );

			//Como os mísseis devem observar o ...
			//... comportamento do jato,...
			//... eles são registrados como...
			//... observadores do jato.

			trace("---------------------------------------------------------");

			trace ("Registrando observadores");
			this._jato.RegistrarObservador(this._missil1);
			this._jato.RegistrarObservador(this._missil2);

			trace("---------------------------------------------------------");

			trace("modificando a direção do jato prá BAIXO");

			//Altera a direção do jato...
			this._jato.ModificarDirecao("BAIXO");

			//... e exibe a direção dos objetos na tela
			trace( "Direção do jato: "
				  + this._jato.RetornarDirecao() );
			trace( "Direção do míssil 1: "
				  + this._missil1.RetornarDirecao() );
			trace( "Direção do míssil 2: "
				  + this._missil2.RetornarDirecao() );

			/*
			Caso um desenvolvedor queira estender a ...
			... funcionalidade do programa ...
			... adicionando um novo tipo de
			... observador, ele pode fazê-lo sem   ...
			... a necessidade de mexer no código atual.
			Para isso, basta ...
			... adicionar sua nova classe ...
			... (THelicoptero, nesse caso), fazê-la ...
			... implementar a interface IObserver ...
			... e adicioná-lo à lista de ...
			... chamadas de objetos de perseguição.
			Veja no exemplo abaixo:
			*/

			trace("---------------------------------------------------------");
			trace("Registrando observadores");

			//O Helicóptero entra na perseguição ...
			this._helicoptero = new THelicoptero("LESTE");
			// ... sendo registrado também como observador
			this._jato.RegistrarObservador(this._helicoptero);

			trace("---------------------------------------------------------");

			//Altera a direção do jato...
			trace("modificando a direção do jato prá CIMA");
			this._jato.ModificarDirecao("CIMA");

			//... e exibe a direção dos objetos na tela
			trace( "Direção do jato: "
				  + this._jato.RetornarDirecao() );
			trace( "Direção do míssil 1: "
				  + this._missil1.RetornarDirecao() );
			trace( "Direção do míssil 2: "
				  + this._missil2.RetornarDirecao() );
			trace( "Direção do helicóptero: "
				  + this._helicoptero.RetornarDirecao() );
		}
	}
}</pre>
<p>A saída desse código é a seguinte:</p>
<pre>Direção do jato: CIMA
Direção do míssil 1: BAIXO
Direção do míssil 2: PARADO
---------------------------------------------------------
Registrando observadores
observador registrado: [object TMissil]
observador registrado: [object TMissil]
---------------------------------------------------------
modificando a direção do jato prá BAIXO
Direção do jato: BAIXO
Direção do míssil 1: BAIXO
Direção do míssil 2: BAIXO
---------------------------------------------------------
Registrando observadores
observador registrado: [object THelicoptero]
---------------------------------------------------------
modificando a direção do jato prá CIMA
Direção do jato: CIMA
Direção do míssil 1: CIMA
Direção do míssil 2: CIMA
Direção do helicóptero: CIMA</pre>
<p><em>"Mas Tiago... Que helicóptero foi aquele ali no meio do código?" </em>Ah é... enquanto estávamos fazendo o código, um outro desenvolvedor achou que helicópteros também são maneiros em perseguições e resolveu implementar um. Notaram como foi fácil adicioná-lo? Bastou que ele implementasse a <em>IObserver</em> que o princípio de Liskov tomou conta do resto. Caso eu queria mais de um Sujeito observado, minha nova classe implementará <em>ISubject</em>. Dessa forma, <strong>adicionar observadores ou sujeitos não implica em modificação alguma no código que já estava pronto.</strong></p>
<p><em>“Outra coisa: e se um observador não quiser mais ser avisado sobre as mudanças do sujeito?”</em> Para isso, a <em>IObserver</em> deverá ter um método <em>removerObservador (observador:IObserver) : void; </em>que vai varrer a lista de observadores e retirá-lo de lá. Isso fica como exercício para quem quiser continuar estudando o padrão.</p>
<p>Na próxima - e última - parte do artigo, disponibilizarei o projeto em AS3.0 e o diagrama de Classes disso tudo ae. Então, até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/padrao-de-projetos-observer-implementando-misseis-teleguiados-parte-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

