<?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; Decorator</title>
	<atom:link href="http://www.nusseagora.blog.br/tag/decorator/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>Decorando um jogo com o padrão de projetos Decorator – Parte 2</title>
		<link>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%e2%80%93-parte-2</link>
		<comments>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%e2%80%93-parte-2#comments</comments>
		<pubDate>Sun, 26 Jul 2009 20:52:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Downloads]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Decorator]]></category>
		<category><![CDATA[jogo]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=461</guid>
		<description><![CDATA[Para fechar o artigo anterior, como foi prometido, segue abaixo o diagrama do padrão de projetos Decorator. Apesar da longa explicação e do funcionamento diferente, o diagrama é bem simples: A única coisa diferente nesse diagrama é o fato de TDecoratorBonus possuir, além da herança de TArma,  o atributo _arma do tipo TArma, fazendo assim [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><script src="http://rec6.via6.com/link.php?action=widget&amp;url=http://nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%25e2%2580%2593-parte-2%2F" type="text/javascript"></script></span></p>
<p style="margin-left: 70pt; text-align: justify">Para fechar o artigo anterior, como foi prometido, segue abaixo o diagrama do padrão de projetos Decorator. Apesar da longa explicação e do funcionamento diferente, o diagrama é bem simples:</p>
<p style="margin-left: 70pt; text-align: justify"><span id="more-461"></span></p>
<div id="attachment_478" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-478" title="diagramaDecorator" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/07/diagramaDecorator.jpg" alt="diagramaDecorator" width="500" height="237" /><p class="wp-caption-text">Diagrama do padrão de projetos Decorator</p></div>
<p style="text-align: left;">A única coisa diferente nesse diagrama é o fato de <em>TDecoratorBonus</em> possuir, além da herança de TArma,  o atributo <em>_arma</em> do tipo <em>TArma</em>, fazendo assim que surjam as 2 setas. Além disso, basta não se esquecer que <em>TEfeito</em> e <em>TEncantamento</em> têm, por herança de <em>TDecoratorBonus</em>, seus próprios atributos <em>_arma</em></p>
<p style="text-align: left;">O código do padrão (Action Script 3.0 com projeto Flash CS3) pode ser encontrado aqui: [download id="1"]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-%e2%80%93-parte-2/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Decorando um jogo com o padrão de projetos Decorator &#8211; Parte 1</title>
		<link>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-parte-1</link>
		<comments>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-parte-1#comments</comments>
		<pubDate>Mon, 20 Jul 2009 23:16:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Action Script 3.0]]></category>
		<category><![CDATA[Análise de Sistemas]]></category>
		<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Padrões de Projeto]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[Decorator]]></category>
		<category><![CDATA[jogo]]></category>
		<category><![CDATA[World of Warcraft]]></category>
		<category><![CDATA[WoW]]></category>

		<guid isPermaLink="false">http://nusseagora.blog.br/?p=403</guid>
		<description><![CDATA[Você e 4 amigos, uma esquadrilha de netherdrakes, helicópteros, grifos e hipogrifos, girando por Oshu’gun enquanto procuram o gigante comedor de dragões Durn the Hungerer. Apesar da ameaça, vocês estão confiantes em seu grupo. O entardecer de Nagrand mostra a silhueta do gigante no horizonte e vocês sabem que a hora chegou. A luta foi [...]]]></description>
			<content:encoded><![CDATA[<p><span style="float: left"><!--rec6--></span></p>
<p style="margin-left: 70pt; text-align: justify"><em>Você e 4 amigos, uma esquadrilha de netherdrakes, helicópteros, grifos e hipogrifos, girando por Oshu’gun enquanto procuram o gigante comedor de dragões Durn the Hungerer. Apesar da ameaça, vocês estão confiantes em seu grupo. O entardecer de Nagrand mostra a silhueta do gigante no horizonte e vocês sabem que a hora chegou.</em></p>
<p><em>A luta foi perfeita: o gigante arrasou com o grupo nos 20s mais estilosos que qualquer monstro do World of Warcraft  já viu. Depois de 15min de brigas sobre quem tem a culpa, alguém descobre que o grupo não estava tão preparado assim. Todos então  resolvem melhorar seus equipamentos... Mas como?</em></p>
<p>Apresento-lhes a morte do grande gigante, o padrão Decorator.</p>
<p><span id="more-403"></span>Vários jogos permitem a seus jogadores um vasto leque de personalização. Eles permitem que configuremos os personagens para que eles sejam o mais parecido possível com a gente em muito mais que só altura e cor de cabelos. Tais jogos permitem que configuremos também a forma com que esse personagem reage ao mundo de jogo, definindo coisas como a velocidade, o tipo de magia que ele usa ou o quanto sustenta de dano. Alguns jogos permitem até que você configure os itens que eles usam. Assim é o <em>World of Warcraft</em>, a febre do momento no mundo dos RPGS massivos (os <em>MMORPGS</em>).</p>
<p>Para vencer os desafios no WoW, os jogadores podem utilizar encantamentos, gemas, itens e diversos efeitos diferentes para aumentar suas características. Se foi isso que faltou no grupo, é isso que daremos a ele.</p>
<p>Comecemos pegando uma das armas dos jogadores. Essa arma exemplo será a classe TArma abaixo:</p>
<pre class="brush:java">package Efeitos
{
	public class TArma
	{
		protected var _nome:String; // Damos um nome qualquer e …
		protected var _efeito:String; // … um efeito…

		public function TArma()
		{
			// ... mas setamos para os valores normais ...
			// ... afinal de contas, a arma não tem nada de especial ...
			// ... ainda
			this._nome = "Arma sem Bônus";
			this._efeito = "";
		}

		public function retornaNome():String
		{ return this._nome; }

		public function retornaEfeito():String
		{ return this._efeito; }
	}
}</pre>
<p>Essa arma é o que os personagens têm no momento e, como já sabemos, isso não é o suficiente. <em>Que tal incluirmos esses tais efeitos e </em><em>encantamentos? Assim estaríamos adicionando a força necessária que os personagens precisam, não Tiago? É só criar uns métodos retornaEncantamento() como você fez e pronto.</em></p>
<p>Não só poderíamos adicionar tais características como várias outras características à arma. O problema é o futuro: a cada vez que um ou vários novos bônus aparecessem no nosso jogo, fossem modificados ou simplesmente excluídos do jogo (o que acontece com muita frequência), teríamos que atualizar essa classe <em>Tarma</em>, bem como TODO O CÓDIGO fazendo as chamadas a esses bônus, no caso deles simplesmente não existirem mais . Isso a torna alvo de alterações cíclicas, o que é longe de ser legal. A idéia aqui é encapsular essas alterações, aplicando-as como um skin ou tema à arma.</p>
<p>Para conseguirmos tal estrutura, usaremos o padrão Decorator: iremos “enfeitar” a arma com quantos bônus especiais precisarmos, aproveitando que ela já possui algo engatilhado para isso (afinal de contas, o método <em>retornaEfeito()</em> não está lá à toa) . Para isso, precisamos inicialmente criar a classe TDecoratorBonus:</p>
<pre class="brush:java">package Efeitos
{
	//import Status.TStatus;

	public class TDecoratorBonus extends TArma
	{
		protected var _arma:TArma; // O Decorador possui uma instância de TArma.

		/***************************************************************
		Construtor da classe. Tem os atributos da TArma a ser decorada ...
		... por ser um tipo de arma.
		****************************************************************/
		public function TDecoratorBonus()
		{
			this._nome = "sem nome";
			this._efeito="";
		}
		/***************************************************************
		Esse método sobrescreve (overrides) o método retornaNome() da ...
		... classe TArma.
		****************************************************************/
		public override function retornaNome():String
		{ return this._nome; }
	}
}</pre>
<p>Essa classe é o coração do nosso decorador: ela é a responsável pela estrutura de encapsulamento dos diversos efeitos. A principal estrela dessa clase é, sem dúvidas, o atributo <em>protected var _arma:TArma</em>. Sua função é guardar a camada de efeitos no caso dessa camada ser envolvida por outra camada. <em>Não entendi nada, Tiago.Como assim camada envolvida por outra camada?</em> Bom, se você pensar bem, estou falando de camadas como aquelas bonecas russas chamadas <a href="http://pt.wikipedia.org/wiki/Matrioshka" target="_blank">matrioshka</a> que guardam outras bonecas idênticas dentro: essa instância seria uma "âncora" para que pudéssemos ir para a "boneca de dentro". Essa boneca de dentro, por sua vez, também tem sua boneca de dentro até o ponto em que não haja mais bonecas dentro.</p>
<p>Cada uma dessas bonecas é, no nosso exemplo, uma das camadas de bônus do padrão decorador, como a classe abaixo:</p>
<pre class="brush:java">package Efeitos
{
	public class TEfeito extends TDecoratorBonus
	{

		/***************************************************************
		Construtor da classe recebe um objeto TArma. Ele é jogado para ...
		... a instância this._arma, encapsulando assim mais um nível para ...
		... a recursividade do padrão.
		****************************************************************/
		public function TEfeito(arma:TArma)
		{
			//Os seguintes atributos vieram por herança de TDecoratorBonus;
			this._arma = arma;
			this._efeito = "+10";
		}

		/***************************************************************
		Método que sobrescreve o retornaEfeito da classe TDecoratorBonus, ...
		... chamando ele próprio na instância this._arma da classe. Dessa ...
		... forma, o método inicia uma cadeia de chamadas que termina ...
		... na classe mais interna, a que não possui uma instância de ...
		... _arma.
		****************************************************************/
		public override function retornaEfeito():String
		{
			// Por ser um padrão de recursividade, é obrigatório que...
			// ... chamemos this._arma.retornaEfeito(). Só assim o ...
			// ... método continuará chamando os efeitos encapsulados.
			return (this._efeito + " " + this._arma.retornaEfeito());
		}
	}
}</pre>
<p>Para fazer as camadas de bônus funcionarem, entra em ação uma coisa chamada <em>recursividade</em>: de forma simplificada (e, quem sabe, um dia eu escreva de forma completa), recursividade é a capacidade de um método ou função chamar a si mesma por várias vezes, retornando resultados para ela própria. Por enquanto, basta saber que o método <em>retornaEfeito() </em>é recursivo por chamae <em>retornaEfeito() </em>novamente, mas agora na camada de dentro (que, como já sabemos, é o atributo <em>this._arma</em>). A camada interna, por sua vez, chama <em>retornaEfeito() </em>de sua <em>this._arma</em>, que chama <em>retornaEfeito() </em>de sua <em>this._arma</em>, que chama <em>retornaEfeito() </em>de sua... Isso só acaba quando chegamos na arma inicial, a <em>TArma</em>, cujo método <em>retornaEfeito() </em>não chama outro <em>retornaEfeito() </em>e sim, exibe seu <em>this._efeito</em>.</p>
<p>Nesse momento, cada <em>retornaEfeito()</em> chamado retorna seu <em>this._efeito </em>para o método <em>retornaEfeito() </em>que o chamou, que concatena com seu próprio <em>this._efeito </em>e retorna para o método <em>retornaEfeito() </em>que o chamou, que concatena com seu próprio <em>this._efeito </em>e retorna para o método <em>retornaEfeito() </em>que o chamou, que concatena com seu próprio <em>this._efeito </em>e retorna... O fim desse ciclo se dá quando não houver mais retornos a chamadas a <em>retornaEfeito()</em>, o que no nosso exemplo acontece na classe <em>TMain</em> mais à frente.</p>
<p>Essa estrutura fica assim:</p>
<div id="attachment_406" class="wp-caption aligncenter" style="width: 407px"><img class="size-full wp-image-406" title="camadasDoDecorator" src="http://nusseagora.dominiotemporario.com/wp-content/uploads/2009/07/camadasDoDecorator.jpg" alt="Camadas" width="397" height="482" /><p class="wp-caption-text">Camadas</p></div>
<p>Com o padrão conseguimos criar uma arma genérica que possui ao seu redor várias camadas de efeitos e que funciona do exato mesmo jeito que uma arma que não possui efeito algum. Além disso, podemos ter diferentes tipos de efeitos, cada um implementado por uma classe diferente. Vou criar agora um TEncantamento:</p>
<pre class="brush:java">package Efeitos
{
	import Efeitos.TDecoratorBonus;

	public class TEncantamento extends TDecoratorBonus
	{

		public function TEncantamento(arma:TArma)
		{
			this._arma = arma;
			this._efeito = "Mongoose";
		}

		public override function retornaEfeito():String
		{
			return (this._arma.retornaEfeito() + " " + this._efeito);
		}
	}
}</pre>
<p>Por fim, basta decorarmos a arma:</p>
<pre class="brush:java">package
{
	import flash.display.MovieClip;
	import Efeitos.TDecoratorBonus;
	import Efeitos.TEncantamento;
	import Efeitos.TEfeito;
	import Efeitos.TArma;

	public class TMain extends MovieClip
	{
		public function TMain()
		{
			// Criamos uma arma qualquer ...
			var arma = new TArma();

			trace ("Antes dos efeitos"); // ... e exibimos seus bônus iniciais.
			trace ( arma.retornaEfeito() );
			trace ();
			trace("---------------------------------------");
			trace ();

			// Agora o padrão entra em ação. Criamos um efeito TEfeito que ...
			// encapsula a arma atual e é passado para ela mesma. Agora ...
			// arma tem dentro de si um TEfeito.
			// Efeito +10
			arma = new TEfeito(arma);

			// Pegamos agora a TEfeito e jogamos dentro de TEncantamento, ...
			// ... passando novamente para a arma. Agora ela tem um ...
			// TEncantamento que tem um TEfeito.
			arma = new TEncantamento(arma);

			// ... que vai dentro de mais um TEfeito ...
			arma = new TEfeito(arma);

			// ... que termina dentro de outro TEfeito
			arma = new TEfeito(arma);

			// Ao realizarmos a chamada a arma.retornaEfeito(), o próprio ...
			// ... método se encarrega de chamar retornaEfeito() das ...
			// ... instâncias encapsuladas, de forma recursiva.

			trace ( arma.retornaEfeito() );
		}
	}
}</pre>
<p>No próximo artigo eu disponibilizo o projeto (Flash CS3) e os arquivos das classes (Action Script 3.0). Falo também do diagrama de classes dessa brincadeira toda. Até lá, caso alguém tenha qualquer dúvida, basta perguntar.</p>
<p><em>No final de uma longa batalha, O gigante finalmente tomba. Seu colossal corpo vai agora servir de alimento para as criaturas que das quais sua linhagem alimentou-se durante eras. Os heróis retornam para suas montarias e tudo volta a ser tranqüilo, graças ao padrão Decorator.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.nusseagora.blog.br/decorando-um-jogo-com-o-padrao-de-projetos-decorator-parte-1/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

