<?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>Gustavo Dutra &#187; Design Patterns</title>
	<atom:link href="http://gustavodutra.com/categoria/nerd/design-patterns/feed/" rel="self" type="application/rss+xml" />
	<link>http://gustavodutra.com</link>
	<description>Um pouco de tudo, nada de pouco</description>
	<lastBuildDate>Thu, 29 Jul 2010 22:57:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Facade Pattern com perl orientado a objetos</title>
		<link>http://gustavodutra.com/post/288/facade-pattern-com-perl-orientado-a-objetos/</link>
		<comments>http://gustavodutra.com/post/288/facade-pattern-com-perl-orientado-a-objetos/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 19:07:07 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[facade pattern]]></category>
		<category><![CDATA[felixibilidade]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[orientacao a objeto]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=288</guid>
		<description><![CDATA[Olá! Faz um tempo que não mexo com perl. Encontrei perdido um arquivo com esse exemplo que fiz em 2008, segundo a data de última modificação. Então, decidi dar continuidade aos posts de design patterns. Esse padrão é bem interessante, poderia ser traduzido para Fachada.
Eu gosto dessa tradução, porque traduz bem direitinho o que ele [...]]]></description>
			<content:encoded><![CDATA[<p>Olá! Faz um tempo que não mexo com <em>perl</em>. Encontrei perdido um arquivo com esse exemplo que fiz em 2008, segundo a data de última modificação. Então, decidi dar continuidade aos posts de <strong>design patterns</strong>. Esse padrão é bem interessante, poderia ser traduzido para <strong>Fachada</strong>.</p>
<p>Eu gosto dessa tradução, porque traduz bem direitinho o que ele representa, é uma fachada para &#8220;esconder&#8221; chamadas de vários métodos de objetos diferentes atrás de um mesmo método. Pense assim:</p>
<p>Toda vez que eu aperto o botão de uma máquina de café e pedir um mocacchino, acontece a mesma coisa:</p>
<ul>
<li>Moe-se o café</li>
<li>Pega-se um copo</li>
<li>Esquenta-se a água</li>
<li>Passa-se o café</li>
<li>Coloca-se o café passado no copo</li>
<li>Coloca-se o chocolate</li>
<li>Coloca-se o leite</li>
<li>Apita pra dizer que está pronto</li>
</ul>
<p>Se olharmos isso com a visão de um <em>pojetista</em>, vemos que temos várias responsabilidades e que não podemos deixar tudo numa mesma classe, como por exemplo:</p>
<ul>
<li>Responsável por moer o café</li>
<li>Responsável por colocar algo no copo</li>
<li>Responsável por pegar 1 copo novo</li>
<li>Responsabilidade de saber quanto de cada ingrediente por no copo</li>
<li>Responsabilidade de apitar e escrever nos leds</li>
</ul>
<p>Enfim, para que o código seja organizado, precisamos distribuir as responsabilidades de acordo com as necessidades e obrigações de cada classe. Porém, cada vez que o botão for pressionado, seria muito cruel ter que chamar várias classes e executar esses métodos que selecionam o copo, moem o grão, etc.</p>
<p>Para esses casos foi pensando o <strong>Facade Pattern,</strong> ou seja, a <strong>Fachada</strong>. Todo aquele algoritmo descrito na primeira lista acima, é encapsulado dentro de uma classe específica para a máquina de café, dentro do método <em>pressionaBotao</em>, por exemplo. Chamando o método, ele se encarrega de interagir com os objetos de seleção do copo, do cálculo da quantidade de ingredientes, etc.<br />
<span id="more-288"></span><br />
Fiz um exemplo em <em>perl</em>, pensando num cinema. Acredito que fique fácil entender a partir dele. Seguem as classes utilizadas:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl -w</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># Classe representando o amplificador</span>
	<span style="color: #000066;">package</span> Amplifier<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga o amplificador</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Amplifier [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga o amplificador</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Amplifier [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># Muda o volume</span>
	<span style="color: #000000; font-weight: bold;">sub</span> setVolume <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$volume</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #000066;">printf</span> <span style="color: #ff0000;">&quot;Turning the Amplifiers volume to %d%%<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$volume</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># coloca no mudo</span>
	<span style="color: #000000; font-weight: bold;">sub</span> mute <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">setVolume</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># Classe representado o aparelho de DVD</span>
	<span style="color: #000066;">package</span> Dvd<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'stop'</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>movie<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga o dvd</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the DVD Player [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga o dvd</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the DVD Player [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># da play no filme</span>
	<span style="color: #000000; font-weight: bold;">sub</span> play <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$movie</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'play'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>stop<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>play<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$movie</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>movie<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$movie</span><span style="color: #339933;">;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'play'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #000066;">printf</span> <span style="color: #ff0000;">&quot;Playing the movie %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$movie</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># da stop no filme</span>
	<span style="color: #000000; font-weight: bold;">sub</span> stop <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'play'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'stop'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #000066;">printf</span> <span style="color: #ff0000;">&quot;Stoping the movie %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>movie<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>movie<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># ejeta a bandeja pra por no dvd</span>
	<span style="color: #000000; font-weight: bold;">sub</span> eject <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'play'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>stop<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Ejecting the DVD<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># classe representando o projetor</span>
	<span style="color: #000066;">package</span> Projector<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># ajusta o canal de vídeo</span>
	<span style="color: #000000; font-weight: bold;">sub</span> videoChannel <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Setting Video Channel<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga o projetor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Project [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga o projetor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Project [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># Classe representando as luzes do cinema</span>
	<span style="color: #000066;">package</span> Lights<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'off'</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga as lâmpadas</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'off'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Lights [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'on'</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga as lâmpadas</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'on'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'off'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Lights [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># classe representando uma máquina de pipoca</span>
	<span style="color: #000066;">package</span> PopcornMachine<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'off'</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># liga a máquina</span>
	<span style="color: #000000; font-weight: bold;">sub</span> on <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'off'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'on'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Popcorn Machine [ON]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># estoura as pipocas</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000066;">pop</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'on'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Poping the corns ;P<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># desliga a máquina</span>
	<span style="color: #000000; font-weight: bold;">sub</span> off <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'on'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>state<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'off'</span><span style="color: #339933;">;</span>
			<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Turning the Popcorn Machine [OFF]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A <strong>orientação a objetos</strong> no <em>perl</em> é meio sinistra. Existem diversas formas de se programar orientado a objetos no perl, eu escolhi esta pois parece mais simples e fácil. Bom, essas são as classes utilizadas:</p>
<ul>
<li>Amplifier</li>
<li>DVD</li>
<li>Projector</li>
<li>Lights</li>
<li>PopcornMachine</li>
</ul>
<p>Bom, cada vez que um filme inicia ou termina no cinema, várias operações são repetidas sempre. Alguém já viu cinema com as luzes acesas? Bem, sempre se desliga as luzes. Então observe a classe abaixo que representa o <strong>Facade</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># classe representando o cinema</span>
	<span style="color: #000066;">package</span> CineFacade<span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;"># construtor</span>
	<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <span style="color: #000066;">ref</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>amplifier<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>projector<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>lights<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>popcornMachine<span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">||</span> <span style="color: #000066;">undef</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">bless</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$this</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000066;">return</span> <span style="color: #0000ff;">$this</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># começa a ver o filme</span>
	<span style="color: #000000; font-weight: bold;">sub</span> watchMovie <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$movie</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># Popcorn machine</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>popcornMachine<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>popcornMachine<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">pop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># Home lights</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>lights<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># Projector</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>projector<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>projector<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">videoChannel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># Amplifier</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>amplifier<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>amplifier<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">setVolume</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #666666; font-style: italic;"># DVD</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">play</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$movie</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;"># termina de ver o filme</span>
	<span style="color: #000000; font-weight: bold;">sub</span> endMovie <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$this</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>popcornMachine<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>lights<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">on</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>projector<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>amplifier<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">stop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">eject</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #0000ff;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span>dvd<span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">off</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Observem o método <em>watchMovie</em> e <em>endMovie</em>. Eles chamam operações comum a todas as seções do cinema.<br />
Aqui vai  o exemplo de uso do facade no meio da aplicação:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;"># Exemplo de uso</span>
	<span style="color: #0000ff;">$cine</span> <span style="color: #339933;">=</span> CineFacade<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span>
			Amplifier<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			Dvd<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			Projector<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			Lights<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			PopcornMachine<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Movie Session started: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$cine</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">watchMovie</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'Titanic'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000066;">print</span> <span style="color: #ff0000;">&quot;Movie Session ended: <span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$cine</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">endMovie</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>O <em>output</em> é mais ou menos assim:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Movie Session started: 
&nbsp;
Turning the Popcorn Machine [ON]
Poping the corns ;P
Turning the Project [ON]
Setting Video Channel
Turning the Amplifier [ON]
Turning the Amplifiers volume to 100%
Turning the DVD Player [ON]
Playing the movie Titanic
&nbsp;
Movie Session ended: 
&nbsp;
Turning the Popcorn Machine [OFF]
Turning the Lights [ON]
Turning the Project [OFF]
Turning the Amplifier [OFF]
Stoping the movie Titanic
Ejecting the DVD</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/288/facade-pattern-com-perl-orientado-a-objetos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como usar Adapter Pattern com python</title>
		<link>http://gustavodutra.com/post/40/como-usar-adapter-pattern-com-python/</link>
		<comments>http://gustavodutra.com/post/40/como-usar-adapter-pattern-com-python/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 00:45:44 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[oque]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[reuso]]></category>

		<guid isPermaLink="false">http://blog.gustavodutra.com/?p=40</guid>
		<description><![CDATA[Olá! Dando continuidade ao post anterior, sobre Decorator Pattern. Mostrarei neste post aqui um exemplo de como e porquê usar o Adapter Pattern. Qualquer dúvida, comente!

O que é Adapter Pattern?
Bom, imaginemos aqueles cartões de memória de máquina fotográfica. Existem de várias tamanhos, micro, pequenos, grandes, gigantes. Seria realmente uma merda se uma máquina fotográfica suportasse [...]]]></description>
			<content:encoded><![CDATA[<p>Olá! Dando continuidade ao post anterior, sobre Decorator Pattern. Mostrarei neste post aqui um exemplo de como e porquê usar o Adapter Pattern. Qualquer dúvida, comente!<br />
<span id="more-40"></span></p>
<h2>O que é Adapter Pattern?</h2>
<p>Bom, imaginemos aqueles cartões de memória de máquina fotográfica. Existem de várias tamanhos, micro, pequenos, grandes, gigantes. Seria realmente uma merda se uma máquina fotográfica suportasse somente 1 tamanho, por isso foi inventada aqueles&#8230; adivinhem&#8230; adaptadores que permitem que micros e pequenos caibam em grande, por exemplo. Todos tem a mesma finalidade, porém, têm tamanhos diferentes.Para isso serve o Adapter Pattern, para resolver justamente esse tipo de problema.</p>
<p>Quando se fala em abstração, geralmente se fala em Adapter Pattern, justamente por isso, porque ele te permite, com um mesmo objeto, fazer ações diferentes com uma finalidade em comum.</p>
<p>Para entendermos melhor, pensemos no caso de abstração de banco de dados. A sintaxe de cada um é <strong>diferente</strong>, porém têm as <strong>mesmas claúsulas</strong>. Alguns permitem transações, outros não. Pois esta é uma situação perfeita para o Adapter Pattern. Mas seria muito complexo explicar utilizando ela como exemplo, logo, fiz um exemplo em python que vai ajudar.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> ShapeAbstract<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> countCorner<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">corners</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">name</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>: abstract
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SquareShape<span style="color: black;">&#40;</span>ShapeAbstract<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, x, y=<span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">corners</span> = <span style="color: #ff4500;">4</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Square'</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>x <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
			<span style="color: #008000;">self</span>.<span style="color: black;">l</span> = x
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">l</span><span style="color: #66cc66;">*</span><span style="color: #008000;">self</span>.<span style="color: black;">l</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TriangleShape<span style="color: black;">&#40;</span>ShapeAbstract<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, x, y<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">corners</span> = <span style="color: #ff4500;">3</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">name</span> = <span style="color: #483d8b;">'Triangle'</span>
		<span style="color: #008000;">self</span>.<span style="color: black;">x</span> = x
		<span style="color: #008000;">self</span>.<span style="color: black;">y</span> = y
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">x</span><span style="color: #66cc66;">*</span><span style="color: #008000;">self</span>.<span style="color: black;">y</span><span style="color: black;">&#41;</span>/<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Bom, Tudo começa na nossa classe abstrata ShapeAbstract. Ela é a classe que vai servir de base para todos as formas que vamos calcular a área. Temos a classe <em>SquareShape</em> que representa um quadrado (jura? :/). O construtor da classe, __init__, recebe 2 valores: altura e a largura. Visto que é um quadrado, todos os lados são iguais, não é necessário passar a altura, ficamos somente com a largura. O que difere do triângulo, cujas medidas são base e altura. A nomenclatura não importa, no caso, vamos utilizar no máximo 2 medidas.</p>
<p>Nosso adapter é simplório, caso houvesse a necessidade de calcular a área de um trapésio, seria necessário mais um parâmetro, afinal, a fórmula é: ((base maior + base menor) / 2 * altura). Isso é facilmente implantado utilizando apenas mais um parâmetro no __init__, porque o que realmente queremos é fazer com que o método area() nos retorne a área.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> Shapes
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Shape<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> setAdapter<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, Adapter<span style="color: black;">&#41;</span>:
		<span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span> = Adapter
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> countCorner<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span>.<span style="color: black;">countCorner</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> area<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span>.<span style="color: black;">area</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">Adapter</span>.<span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
	<span style="color: #ff7700;font-weight:bold;">def</span> newShape<span style="color: black;">&#40;</span>ShapeAdapter<span style="color: black;">&#41;</span>:
		shape = Shape<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		shape.<span style="color: black;">setAdapter</span><span style="color: black;">&#40;</span>ShapeAdapter<span style="color: black;">&#41;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> shape
&nbsp;
	newShape = <span style="color: #008000;">staticmethod</span><span style="color: black;">&#40;</span>newShape<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
	shape = Shape.<span style="color: black;">newShape</span><span style="color: black;">&#40;</span>Shapes.<span style="color: black;">SquareShape</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">countCorner</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">area</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#Imprime:</span>
        <span style="color: #808080; font-style: italic;">#Square</span>
        <span style="color: #808080; font-style: italic;">#4</span>
        <span style="color: #808080; font-style: italic;">#25</span>
&nbsp;
	shape = Shape.<span style="color: black;">newShape</span><span style="color: black;">&#40;</span>Shapes.<span style="color: black;">TriangleShape</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span>,<span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">countCorner</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">area</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;">#Imprime:</span>
        <span style="color: #808080; font-style: italic;">#Triangle</span>
        <span style="color: #808080; font-style: italic;">#3</span>
        <span style="color: #808080; font-style: italic;">#15</span></pre></div></div>

<p>Nesta &#8220;aplicação principal&#8221; vemos a real <strong>classe adaptativa</strong>: Shape. Ela recebe a instância da classe e executa os métodos dela. Parece bobo ter uma classe que executa o método de outra classe, mas é fundamental para o <strong>reuso</strong> e a famosa <strong>abstração</strong>.</p>
<p>Vejam que elas se comportam diferentes. Claro, são formas diferentes! Áreas diferentes! Número de cantos diferentes! E nomes direfentes!</p>
<p>Agora fica fácil ver esse exemplo abstraindo, por exemplo, um banco de dados? Pense que a classe Shape seja Database, TriangleShape seja MySQLDatabase e SquareShape seja MSSQLDatabase, o método area() seja o método setLimit().</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">shape = Database<span style="color: black;">&#40;</span>MySQLDatabase<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">setLimit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: #808080; font-style: italic;">#Imprimi: LIMIT 5</span>
shape = Database<span style="color: black;">&#40;</span>MSSQLDatabase<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> shape.<span style="color: black;">setLimit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: #808080; font-style: italic;">#Imprimi: TOP 5</span></pre></div></div>

<h2>Usando Adapter para 3rd part</h2>
<p>Uma das minhas sugestões de uso do Adapter Pattern é com integração de código de terceiros. Vamos supor que você tenha 3 bibliotecas que geram gráficos: X, Y e Z. A bilioteca X é muito boa, mas não tem gráficos em pizza, que na Y tem. Mas a Z, por sua vez, tem gráficos em pizza em 3d. Vamos analizar a situação:</p>
<ul>
<li>A responsabilidade é a mesma: gerar um gráfico.</li>
<li>Independente do tipo de gráfico (com barras, pizza, etc), todas elas vão receber os mesmos tipos de dados.</li>
<li>Cada biblioteca tem seus próprios métodos, com nomes diferentes, mas para as mesma finalidade</li>
</ul>
<p>Não parece um lugar perfeito para se utilizar o Adapter Pattern? Ora, vamos fazer um pequeno esboço:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">graph = GraphAdapter<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">setData</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">20</span>,<span style="color: #ff4500;">30</span>,<span style="color: #ff4500;">10</span><span style="color: black;">&#93;</span>,<span style="color: black;">&#91;</span><span style="color: #ff4500;">15</span>,<span style="color: #ff4500;">25</span>,<span style="color: #ff4500;">35</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">desenhaGrafico</span><span style="color: black;">&#40;</span>GRAFICOS.<span style="color: black;">BARRA</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">desenhaGrafico</span><span style="color: black;">&#40;</span>GRAFICOS.<span style="color: black;">PIZZA</span><span style="color: black;">&#41;</span>
graph.<span style="color: black;">desenhaGrafico</span><span style="color: black;">&#40;</span>GRAFICOS.<span style="color: black;">PIZZA3D</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Observem que não utilizei a instância de uma classe como adapter, utilizei constantes que vão determinar, na hora de desenhar o gráfico, o tipo dele. Se for BARRA, faz justamente como a biblioteca X exige, usando a API dela. O mesmo para PIZZA (Y) e PIZZA3D (Z). Pronto! Você, utilizando patterns, terá seu próprio modo de gerar gráficos, mesmo que com bibliotecas diferentes! Comentem e até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/40/como-usar-adapter-pattern-com-python/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>O que é? Como e Por quê usar? &#8211; Decorator Pattern</title>
		<link>http://gustavodutra.com/post/24/o-que-e-como-e-por-que-usar-decorator-pattern/</link>
		<comments>http://gustavodutra.com/post/24/o-que-e-como-e-por-que-usar-decorator-pattern/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 01:46:18 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[decorator]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[flexibilidade]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[oo]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[oque]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[porque]]></category>
		<category><![CDATA[reuso]]></category>

		<guid isPermaLink="false">http://blog.gustavodutra.com/?p=24</guid>
		<description><![CDATA[Rá! Acá estou eu para explicar um pouco mais sobre o Decorator pattern, um deles que eu acho pouco usado, mas pode salvar vidas. Tem poder na mão. Alguns podem já ter noção do que seja, mas outros devem estar se perguntando: &#8216;WTF??&#8217;. Então vamos lá:
Decorator Pattern
É um pattern desenvolvido para modificar um determinado objeto [...]]]></description>
			<content:encoded><![CDATA[<p>Rá! Acá estou eu para explicar um pouco mais sobre o <strong>Decorator pattern</strong>, um deles que eu acho pouco usado, mas pode salvar vidas. Tem poder na mão. Alguns podem já ter noção do que seja, mas outros devem estar se perguntando: &#8216;WTF??&#8217;. Então vamos lá:<span id="more-24"></span></p>
<h2>Decorator Pattern</h2>
<p>É um pattern desenvolvido para modificar um determinado objeto (seja modificar alguma coisa já existente ou delegar uma nova responsabilidade) sem a necessidade de extendê-lo. O que é muito bom, assim, o reaproveitamento de código é maior ainda! Enfim, vou tentar dar uma explicada no pattern:</p>
<div id="attachment_25" class="wp-caption aligncenter" style="width: 573px"><img class="size-full wp-image-25" title="Diagrama de Classes" src="http://blog.gustavodutra.com/wp-content/uploads/2008/12/class-diagram.png" alt="Diagrama de Classes do Decorator Pattern" width="530" height="291" /><p class="wp-caption-text">Diagrama de Classes do Decorator Pattern</p></div>
<p>Abaixo segue o código usado:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Message <span style="color: #009900;">&#123;</span>
&nbsp;
	protected <span style="color: #000088;">$msg</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getMsg<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">msg</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setMsg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">msg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$msg</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __toString<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Success_Message <span style="color: #000000; font-weight: bold;">extends</span> Message <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DivClass_Decorator<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> Li_Decorator<span style="color: #009900;">&#40;</span>
				<span style="color: #000088;">$this</span>
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'success-msg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>String<span style="color: #009900;">&#41;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Error_Message <span style="color: #000000; font-weight: bold;">extends</span> Message <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$newmsg</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DivClass_Decorator<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> Li_Decorator<span style="color: #009900;">&#40;</span>
				<span style="color: #000088;">$this</span>
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">,</span><span style="color: #0000ff;">'error-msg'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>String<span style="color: #009900;">&#41;</span><span style="color: #000088;">$newmsg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">interface</span> Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
abstract <span style="color: #000000; font-weight: bold;">class</span> Msg_Decorator_Abstract <span style="color: #000000; font-weight: bold;">extends</span> Message <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Li_Decorator <span style="color: #000000; font-weight: bold;">extends</span> Msg_Decorator_Abstract implements Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$msg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;ul&gt;&lt;li&gt;'</span><span style="color: #339933;">.</span> <span style="color: #000088;">$msg</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/li&gt;&lt;/ul&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Div_Decorator <span style="color: #000000; font-weight: bold;">extends</span> Msg_Decorator_Abstract implements Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;div&gt;'</span><span style="color: #339933;">.</span> <span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/div&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> DivClass_Decorator <span style="color: #000000; font-weight: bold;">extends</span> Msg_Decorator_Abstract implements Msg_Decorator_Interface <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$class</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$msg</span><span style="color: #339933;">,</span> <span style="color: #000088;">$class</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">class</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$class</span><span style="color: #339933;">;</span>
		parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span>Message <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setMsg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'&lt;div class=&quot;'</span><span style="color: #339933;">.</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">class</span>?<span style="color: #0000ff;">'default-class'</span><span style="color: #339933;">:</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$message</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/div&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>OK! Com o código em mãos, vamos pensar um pouquinho. Tenho uma cacetada de classes, todas fazendo praticamente a mesma coisa. E agora? Calma, Juvenal. Vamos analizar:</p>
<ol>
<li>Temos a classe Mensagem. Sabemos que ele representa uma mensagem. Métodos básicos para manipularmos a mensagem e um <em>__toString()</em> que irá retornar o valor em string pra classe quando for feito o cast.</li>
<li>Classe Msg_Decorator_Abstract que extende da classe Mensagem. Todos os nossos decoradores, por assim dizer, irão ser filhos desta classe. O exemplo é tão simples que a classe abstrata nem tem métodos abstratos. Mas a idéia é que tenha, caso necessário.</li>
<li>Msg_Decorator_Interface, essa interface obriga os programadores que quiserem criar decorators a escrever o método render(). Que é chamado pela nossa classe Abstract no construtor.</li>
<li><em>Li_Decorator, Div_Decorator e DivClass_Decorator</em> são exemplos de decorators.</li>
</ol>
<p>Vamos ver o negócio funcionando? Vamos escrever o seguinte código:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">   	<span style="color: #b1b100;">print</span> <span style="color: #000000; font-weight: bold;">new</span> Div_Decorator<span style="color: #009900;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> Li_Decorator<span style="color: #009900;">&#40;</span>
				<span style="color: #000000; font-weight: bold;">new</span> Message<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Mensagem de teste!&quot;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Irá imprimir</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="xhtml" style="font-family:monospace;">&lt;div&gt;
&lt;ul&gt;
	&lt;li&gt;Mensagem de teste!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre></td></tr></table></div>

<p>Viram? Simples e prático! Claro que o exemplo é bem simples e talvez nem seja tão útil. Mas é só pensar um pouquinho mais que logo surgem exemplos onde se usar o Decorator.</p>
<p>Entender agora fica mais fácil. Apenas comece olhando do meio para a esquerda. Primeiro nós instanciamos a classe Message com o mensagem &#8220;Mensagem de teste!&#8221;. O método <em>getMsg()</em> retornará exatamente isso: &#8220;Mensagem de teste!&#8221;. Porém, no momento em que é instanciado o <em>Li_Decorator</em>, ele vai mudar a mensagem usando o método <em>render()</em>, que deve ser implementado na <em>Msg_Decorator_Interface</em> e chamado na <em>Msg_Decorator_Abstract</em> pelo construtor. E assim acontece com o <em>Div_Decorator</em>.</p>
<p>Notem que eu decidi mudar o valor da mensagem usando o <em>setMsg</em>. Eu já li em alguns lugares onde fica armazenada a instância da classe anterior e então o método <em>getMsg</em> seria chamado em forma de cascata, fazendo com que a mensagem original nunca fosse alterada de verdade, e no fim ela é, igual a um método recursivo, retornada decorada e maquiada.</p>
<h2>Reutilizando o código</h2>
<p>Bom, como eu havia dito no começo, o Observer Pattern nos possibilita o <strong>reuso</strong>. O exemplo são aquelas duas classes das quais eu não cheguei a falar: <strong>Error_Message e Success_Message</strong>.</p>
<p>Observem que são simples e, utilizando os Decorators já existentes, mostram uma mensagem personalizada de Erro e de Sucesso! Para utilizá-las, basta usar:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">print</span> <span style="color: #000000; font-weight: bold;">new</span> Error_Message<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Erro! Você fez algo errado!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">print</span> <span style="color: #000000; font-weight: bold;">new</span> Success_Message<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Sucesso! Parabéns!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>O que imprimirá:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="xhtml" style="font-family:monospace;">&lt;div class=&quot;error-msg&quot;&gt;
&lt;ul&gt;
	&lt;li&gt;Error!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;success-msg&quot;&gt;
&lt;ul&gt;
	&lt;li&gt;Sucesso! Parabéns!&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</pre></td></tr></table></div>

<h3>Prós</h3>
<ul>
<li>Adiciona <strong>flexibilidade</strong> ao código.</li>
<li>Facilmente <strong>reutilizada</strong>.</li>
<li>Ótimo para sistemas que possibilitam o uso de <strong>plugins</strong>.</li>
</ul>
<h3>Contras</h3>
<ul>
<li>Gera um grande número de arquivos (se for pensar que cada arquivo é uma classe ou vice-versa).</li>
<li>Dependendo da quantidade de classes aloca muita memória.</li>
<li>Ruim para sistemas mais fechados e bitolados ou muito padronizados.</li>
</ul>
<p>Acho que é isto pessoal. O que acharam? Não é um bixo de sete cabeças, né?</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/24/o-que-e-como-e-por-que-usar-decorator-pattern/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
