<?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; flexibilidade</title>
	<atom:link href="http://gustavodutra.com/tag/flexibilidade/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>Como usar mod_rewrite de verdade</title>
		<link>http://gustavodutra.com/post/120/como-usar-mod_rewrite-de-verdade/</link>
		<comments>http://gustavodutra.com/post/120/como-usar-mod_rewrite-de-verdade/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 13:38:31 +0000</pubDate>
		<dc:creator>Gustavo Dutra</dc:creator>
				<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Software Livre]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[clean url]]></category>
		<category><![CDATA[como]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[exemplo]]></category>
		<category><![CDATA[flexibilidade]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://gustavodutra.com/?p=120</guid>
		<description><![CDATA[Rá! Hoje quero falar sobre mod_rewrite. Um módulo para o apache que permite reescrever URL&#8217;s. Ele é muito útil em vários sentidos: aumenta a o page rank em buscadores, torna URL&#8217;s limpas e inteligíveis, fazendo com que o usuário consiga lembrá-las muito mais rápida e facilmente.
Porém, como todos os outros artefatos que estão por aí, [...]]]></description>
			<content:encoded><![CDATA[<p>Rá! Hoje quero falar sobre mod_rewrite. Um módulo para o apache que permite reescrever URL&#8217;s. Ele é muito útil em vários sentidos: aumenta a o page rank em buscadores, torna URL&#8217;s limpas e inteligíveis, fazendo com que o usuário consiga lembrá-las muito mais rápida e facilmente.</p>
<p>Porém, como todos os outros artefatos que estão por aí, pode complicar ainda mais a vida de um programador, caso não seja usado adequadamente.</p>
<p><span id="more-120"></span></p>
<h2>Introdução</h2>
<p>Como visto no post anterior, onde está descrito algumas vantagens e desvantages de se usar o mod_rewrite, neste post vamos concluir o assunto. Assumindo que você esteja usando Apache com o mod_rewrite habilitado. Também é necessário o uso de arquivos .htaccess: Arquivos ocultos que contém diretivas interpretadas pelo Apache. Para que seu .htaccess funcione, deve se certificar de que a diretiva <em>AllowOverride All</em> esteja nos arquivos de configuração do apache. Ela deve ficar dentro de &lt;Directory /&gt;, mais ou menos assim:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">	AllowOverride All</pre></div></div>

<p>Basta adicionar ao seus arquivos de configuração do apache ou requisitar seu servidor que o faça.</p>
<h2>Conhecendo as diretivas</h2>
<p>Antes de mais nada, vamos entender o que o mod_rewrite faz e é capaz de fazer, conhecendo seus parâmetros de configurações.</p>
<h4>RewriteEngine on|off</h4>
<p>Habilita(on) ou desabilita(off) o uso do módulo mod_rewrite.</p>
<h4>RewriteOptions [inherit] [MaxRedirects=X]</h4>
<p>   Adiciona uma ou as duas opções.</p>
<h5>inherit</h5>
<p>            Herda os parâmetros dos diretórios pai.</p>
<h5>MaxRedirects=X</h5>
<p>            Ao invés de permitir o &#8216;loop infinito&#8217; de redirecionamento, limita para X vezes. Caso, X seja alcançado, é disparado erro 500 (Internal Error).</p>
<h4>RewriteLog /caminho/para/arquivo.log</h4>
<p>Escreve o log dos eventos ocorridos no arquivo especificado.</p>
<h4>RewriteLogLevel Level</h4>
<p>Level inicia em 0 (desabilitado) e vai até 9 (números superiores podem ser utilizados, mas terão o mesmo efeito: irão logar quase tudo! Use somente para debug, pois vai diminuir a performance do apache. Bom para testes/debug, não para produção.)</p>
<h4>RewriteBase /dir</h4>
<p>Especifica /dir como a base para a procura do arquivo pelo Apache. (Mais explicações adiante)</p>
<h4>RewriteCond </h4>
<p>Responsável pela condições (a.k.a. IF&#8217;s). Pode-se utilizar inúmeros testes antes de especificar uma regra, sendo que a mesma só será executada ao passar por todos os testes com sucesso. Exemplos:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># Se o host for 123.45.67.89
RewriteCond %{REMOTE_ADDR} ^123.45.67.89$ [OR]
# ou for 98.76.54.32
RewriteCond %{REMOTE_ADDR} ^98.76.54.32
# A regra será a seguinte...</pre></div></div>

<p>Podem ser usadas uma série de variáveis, entre elas:</p>
<ul>
<li>%{HTTP_USER_AGENT}</li>
<li>%{HTTP_REFERER}</li>
<li>%{REMOTE_ADDR}</li>
<li>%{SCRIPT_FILENAME}</li>
<li>%{QUERY_STRING}</li>
<li>%{HTTP_HOST}</li>
<li>mais informações <a rel="nofollow" href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond">aqui</a></li>
</ul>
<h4>RewriteRule </h4>
<p>É aqui que realmente acontece a reestruturação da URL. Aqui é onde é dito o que deve ser entrepretado como o quê. Se o Padrão casar, o apache interpreta como se fosse o Caminho.</p>
<p>Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">RewriteRule ^/(about|aboutme|sobre|sobremim|eu|minhavida)$ eu.html [L,NC]</pre></div></div>

<h3>Referências interessantes:</h3>
<ul>
<li><a rel="nofollow" href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html" alt="Documentação do Apache">Documentação do Apache</a></li>
<li><a rel="nofollow" href="http://www.addedbytes.com/cheat-sheets/download/mod_rewrite-cheat-sheet-v2.png" alt="ModRewrite CheatSheet">ModRewrite CheatSheet</a></li>
</ul>
<h2>Exemplos de uso</h2>
<p>Agora, com alguma noção sobre o mod_rewrite, vamos utilizá-los. Com alguns exemplos do que é possível. A idéia é que você descubra um jeito próprio e que funcione PARA VOCÊ. Esta é o tipo da coisa que não adianta fazer porque alguém disse que funciona, deve seguir os seus padrões e cobrir suas necessidades.</p>
<h3>Exemplo 1: Organizando seu site no .htaccess</h3>
<p>Convenhamos: uma notícia sobre um acidente não irá mudar. Depois de submetida para um site de notícias, dificilmente ela irá ser modificada. Ao menos que tenha passado desapercebido um erro de português ou uma estatística imprecisa, uma notícia não será modificada. Portando, é possível manter um cache da notícia em um arquivo .html, evitando consultas desnecessárias a bancos de dados ou outras fontes. Mas só porque ela está em cache, não significa que ela deva aparecer com o .html no fim ou .htm ou seja lá o que for.</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteEngine On
RewriteBase /
# Se não foi requerido um arquivo vazio (-s)
RewriteCond %{REQUEST_FILENAME} !-s [OR]
# Se não foi requerido um link simbólico (-l)
RewriteCond %{REQUEST_FILENAME} !-l [OR]
# ou um arquivo (-f)
RewriteCond %{REQUEST_FILENAME} !-f [OR]
# ou um diretório (-d)
RewriteCond %{REQUEST_FILENAME} !-d
# Aplique a seguinte regra:
# Se for notícia cacheada, chama o cache
RewriteRule ^ler/([A-Za-z0-9_-]+)$ /noticias/cache/$1.html [L]
# Se for para buscar por noticias
RewriteRule ^buscar/([A-Za-z0-9_-]+) /noticias/busca.php?termo=$1&amp;area=noticias [L]
# Feeds
RewriteRule ^feeds$ feeds.php?area=noticias
# Feeds para a categoria X
RewriteRule ^feeds/(.*)$ feeds.php?area=noticias&amp;categoria=$1</pre></div></div>

<p>e assim por diante. Podemos estabelecer regras, inclusive, para subdomínios.</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteCond %{HTTP_HOST} ^en\.example\.com$
RewriteRule ^(.*)$ /news/english/index.php?q=$1 [L]
&nbsp;
RewriteCond %{HTTP_HOST} ^br\.example\.com$
RewriteRule ^(.*)$ /news/brazilian/index.php?q=$1 [L]</pre></div></div>

<p>uma outra sugestão:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteCond %{HTTP_HOST} ^en\.example\.com$
RewriteRule ^(.*)$ /news/index.php?lang=en&amp;q=$1 [L]
&nbsp;
RewriteCond %{HTTP_HOST} ^br\.example\.com$
RewriteRule ^(.*)$ /news/index.php?lang=pt-br&amp;q=$1 [L]</pre></div></div>

<h3>Exemplo 2: Listas de traduções</h3>
<p>A questão de usar uma única variável que receberá o valor da url, funciona melhor para este segundo caso:</p>

<div class="wp_syntax"><div class="code"><pre class="plain" style="font-family:monospace;">RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-s [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,NC]</pre></div></div>

<p>Imagine que seu cliente queira criar páginas novas, de &#8216;política de privacidade&#8217;, &#8217;sobre a empresa&#8217;, seja lá qual for o assunto da página. Ele vai querer acessá-la de forma rápida e acessível. Para tanto, <em>index.php?area=view_page&#038;page=4354</em> não parece agradar muita gente. Não seria interessante deixar que o próprio cliente crie seu padrão de URL? Talvez /politicas ou /empresa.</p>
<p>Existe uma forma interessante de se fazer isso: usando uma lista de expressões regulares e seus arquivos originais, os quais serão usados caso as expressões regulares casarem. Por exemplo, nos casos acima, apenas com o código abaixo no .htaccess, já poderíamos fazer algo:</p>
<p>A idéia é usar a <strong>REQUEST_URI</strong> (no php <strong>$_SERVER['REQUEST_URI']</strong>). Ela retornará, por exemplo, <em>/ler/minha_noticia_bombastica</em> que casará com <em>^/ler/([a-z0-9_-])$</em> e por consequência, irá chamar a <em>noticias.php</em>. Agora, como pegar o &#8216;minha_noticia_bombastica&#8217; ? Fácil! Basta apenas utilizarmos os grupos das expressões regulares de forma apropriada. Usando o exemplo do php, com <em>preg_match</em> podemos resolver isso!</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$urlPatterns</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span>
	<span style="color: #0000ff;">'/^ler\/([a-z0-9_-]+)$/i'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'noticias.php'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$urlPatterns</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$pattern</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$fileName</span><span style="color: #009900;">&#41;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pattern</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$vars</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$_GET</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$vars</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">include</span> <span style="color: #000088;">$fileName</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Pronto! Alguns usuários podem ter notado, mas <em>$vars</em> irá ser uma sequência numérica dos grupos casados:</p>
<p>   <strong>0 => /ler/minha_noticia_bombastica, 1 => &#8216;minha_noticia_bombastica&#8217;</strong></p>
<p> Para resolver isso, podemos dar nomes aos grupos, o que seria extremamente normal para o programador (que utilizaria a variável $_GET normalmente) e bonito aos olhos do cliente. Para tanto, modificamos a nossa $urlPatterns:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">	<span style="color: #000088;">$urlPatterns</span> <span style="color: #339933;">=</span> <span style="color: #990000;">Array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'/ler\/(?&lt;news -slug&gt;[a-z0-9_-]+)$/i'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'noticias.php'</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;&lt;/</span>news<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Assim, poderemos acessar <em>$_GET['news-slug']</em>. Como fica mais difícil do usuário modificar nomes de variáveis vindos da URL, se torna uma solução segura. Podemos ter certeza de que <em>$_GET['news-slug']</em> <strong>não conterá aspas, caracateres hexadecimais ou qualquer outro tipo de código malicioso</strong>. Pois se tivesse, não passaria no teste da expressão regular. E também nos certificamos de que aquele arquivo (noticias.php) só esteja sendo acessado, caso nossa index.php o esteja incluindo. Porque o usuário não conseguirá acessar de fora.</p>
<p>Neste caso, nós estipulamos os valores na <em>$urlPatterns</em>, mas ainda se pode pegar esses <strong>valores do banco de dados</strong>, por exemplo. Uma lista de &#8216;tradução&#8217; para a url. Funciona muito bem, principalmente com páginas estáticas ou fixas. Ao invés do cidadão digitar <em>index.php?area=pages&#038;page_id=4232</em>, ele estará acessando <em>/sobre-a-empresa</em>. Para usuários provenientes de sites de busca, isto é muito importante. Lhe dá muito mais <strong>segurança</strong> e você garante o seu clique. Ele vai direto ao ponto.</p>
]]></content:encoded>
			<wfw:commentRss>http://gustavodutra.com/post/120/como-usar-mod_rewrite-de-verdade/feed/</wfw:commentRss>
		<slash:comments>15</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>
