<?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>CMilfont &#187; Design Patterns</title>
	<atom:link href="http://www.milfont.org/blog/archives/category/design-patterns/feed" rel="self" type="application/rss+xml" />
	<link>http://www.milfont.org/blog</link>
	<description>Ultrapassando os limites da web!</description>
	<lastBuildDate>Sun, 03 Apr 2011 15:25:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Padrões não são gambiarras</title>
		<link>http://www.milfont.org/blog/archives/111</link>
		<comments>http://www.milfont.org/blog/archives/111#comments</comments>
		<pubDate>Mon, 12 Mar 2007 18:46:52 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de software]]></category>

		<guid isPermaLink="false">http://www.milfont.org/blog/archives/111</guid>
		<description><![CDATA[Ultimamente vi uma s&#233;rie de posts no meu feed reader coincidentemente encadeados falando sobre padr&#245;es de projeto e os considerando genericamente gambiarras. Tudo comecou no post do Giovane Roslindo Kuhn falando como &#233; legal usar patterns para a comunica&#231;&#227;o da equipe. O entendimento que se d&#225; no c&#243;digo quando ele &#233; estruturado seguindo conven&#231;&#245;es estabelecidas [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente vi uma s&eacute;rie de posts no meu <a href="http://www.google.com.br/reader" target="_blank">feed reader</a> coincidentemente encadeados falando sobre <a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)" target="_blank">padr&otilde;es de projeto</a> e os considerando genericamente <a href="http://pt.wikipedia.org/wiki/Gambiarra" target="_blank">gambiarras</a>.</p>
<p>Tudo comecou no post do <a href="http://grkuhn.blogspot.com/2007/02/usar-padres-legal.html" target="_blank">Giovane Roslindo Kuhn</a> falando como &eacute; legal usar patterns para a comunica&ccedil;&atilde;o da equipe. O entendimento que se d&aacute; no c&oacute;digo quando ele &eacute; estruturado seguindo conven&ccedil;&otilde;es estabelecidas em padr&otilde;es. Claro que esse n&atilde;o &eacute; uma das caracter&iacute;sticas de se usar um padr&atilde;o, mas sim um beneficiamento dele (mesmo quando evidentemente n&atilde;o necessitaria haver a presen&ccedil;a de um padr&atilde;o).</p>
<p>Motivado por esse post, o <a href="http://jroller.com/page/vfpamp?entry=padr%C3%B5es_ou_gambiarras" target="_blank">V&iacute;tor Ferreira Pamplona</a> escreveu um outro dedicado aos <a href="http://en.wikipedia.org/wiki/Anti-patterns" target="_blank">anti-patterns</a> e a prejudicial caracter&iacute;stica da comunidade java ser reconhecida como a comunidade pattern. Evidenciou a necessidade que programadores empolgados com uma nova linguagem agirem como se essa linguagem fosse uma bala-de-prata e resolvesse todos e quaisquer problemas.</p>
<p>Os pr&oacute;prios padr&otilde;es de projeto conhecidos podem se tornar um anti-pattern se forem usados para um contexto diferente do que se prop&otilde;e inicialmente. Quem nunca viu a&iacute; uma estrutura cheia de commands para simular MVC em um sistema web levante a m&atilde;o.</p>
<p>Ap&oacute;s o post do V&iacute;tor o <a href="http://thiagoarrais.wordpress.com/2007/03/10/gambiarras-com-nomes/" target="_blank">Thiago Arrais</a> publicou um artigo chamando os padr&otilde;es de &quot;gambiarra com nomes&quot; que acabou gerando outro artigo do <a href="http://blog.improveit.com.br/articles/2007/03/10/canivete-suico" target="_blank">Marcos Tapaj&oacute;s</a> no blog da <a href="http://blog.improveit.com.br" target="_blank">Improve It</a> na mesma linha.</p>
<p>Concordo com muitos pontos colocados por ambos mas quero fazer uma ressalva, uma gambiarra &eacute; uma solu&ccedil;&atilde;o improvisada (deveria tamb&eacute;m ser tempor&aacute;ria) e fora dos procedimentos legais. Um padr&atilde;o pode ser uma gambiarra mas em ess&ecirc;ncia n&atilde;o &eacute;.</p>
<p><strong>Gambiarra &quot;Orienta&ccedil;&atilde;o a Objetos&quot;</strong></p>
<p>Se levarmos ao p&eacute; da letra essa considera&ccedil;&atilde;o podemos ent&atilde;o supor que Orienta&ccedil;&atilde;o a objetos seria uma gambiarra, porque os desenvolvedores C j&aacute; simulavam os conceitos de orienta&ccedil;&atilde;o antes do surgimento do C++, que apenas forneceu ADTs nativos espec&iacute;ficos para o desenvolvedor. Linguagens como <a href="http://en.wikipedia.org/wiki/SmallTalk" target="_blank">Smalltalk</a> que foram concebidas tendo em mente a orienta&ccedil;&atilde;o a objetos seria &uacute;nicas verdadeiras OO mesmo que internamente seu interpretador fa&ccedil;a algo parecido com uma linguagem n&atilde;o pura. Mas a &uacute;nica diferen&ccedil;a entre as duas &eacute; a familiaridade da arquitetura interna da linguagem com o padr&atilde;o/conceito que se deseja implementar. Uma esconde do desenvolvedor a implementa&ccedil;&atilde;o a outra temos que criar nosso pr&oacute;prio dialeto e n&atilde;o se beneficiar das otimiza&ccedil;&otilde;es e checagens que por ventura a plataforma fa&ccedil;a.</p>
<p><strong>V&iacute;cios</strong></p>
<p>Temos programadores que acham que podem viver conhecendo apenas uma linguagem e que esta deve servir para tudo, com isso aceitam estruturas estabelecidas mesmo que sejam nocivas.</p>
<p>A Sun criou o conceito de <a href="http://java.sun.com/products/javabeans/" target="_blank">Java Beans</a> para componentes visuais e extendeu esse conceito para sua plataforma Enterprise para designar ADTs que encapsulam suas propriedades.</p>
<p>Hoje a maioria dos desenvolvedores quando codificam suas classes o fazem com um passo-a-passo em mente:</p>
<ol>
<li><em>Cria uma classe que representa uma tabela no banco de dados;</em></li>
<li><em>Cria as propriedades referentes as colunas nessa tabela;</em></li>
<li><em>Atribui private para todas as propriedades;</em></li>
<li><em>E por fim cria m&eacute;todos &quot;set&quot; e &quot;get&quot; para todas as propriedades indiscriminadamente.</em></li>
</ol>
<p>Se voce criar uma constru&ccedil;&atilde;o que acesse &quot;objeto.propriedade&quot; &eacute; pecado mortal em java, n&atilde;o segue a &quot;conven&ccedil;&atilde;o&quot;.</p>
<p>Em linguagens que implementam o ECMAscript voce tem no BOM (Browser Object Model) o m&eacute;todo setProperty(chave, valor) nativo que atribui um valor &agrave; propriedade&nbsp; indicada e n&atilde;o necessita implementar um atribuidor para cada m&eacute;todo. Sabiamente n&atilde;o existe um getProperty, voce acessa diretamente.</p>
<p>Em java se uma propriedade &eacute; read-only tem coer&ecirc;ncia voce aplicar um private no qualificador e criar um m&eacute;todo getX, outra situa&ccedil;&atilde;o &eacute; se voce deseja manipular o valor em tempo de execu&ccedil;&atilde;o, ent&atilde;o um m&eacute;todo get e ou set tem necessidade. Fora isso&nbsp; &eacute; desnecess&aacute;rio e a propriedade &eacute; p&uacute;blica. </p>
<p><strong>Generalidade vs Especificidade</strong>
</p>
<p>O problema maior com padr&otilde;es &eacute; querer extender uma linguagem al&eacute;m do que ela foi arquiteturada. Como simular <a href="http://en.wikipedia.org/wiki/Continuation" target="_blank">Continuations</a> que &eacute; nativo da linguagem <a href="http://www-swiss.ai.mit.edu/projects/scheme/" target="_blank">Scheme</a>, ou <a href="http://en.wikipedia.org/wiki/Design_by_contract" target="_blank">Design By Contract</a> do <a href="http://www.eiffel.com/" target="_blank">Eiffel</a>. Voce pode fazer ambos em Java, tanto <a href="http://www-128.ibm.com/developerworks/library/j-contin.html" target="_blank">Continuations</a> como <a href="http://www-128.ibm.com/developerworks/library/j-ceaop/" target="_blank">DbC</a> podem ser feitas mas com gambiarras, n&atilde;o s&atilde;o inerentes da arquitetura concebida na plataforma Java. Existem at&eacute; <a href="http://www.rifers.org/" target="_blank">Framework</a> e <a href="http://jetty.mortbay.org/" target="_blank">Container</a> Java que implementam continuations, mas <a href="http://www-128.ibm.com/developerworks/java/library/j-cb03216/index.html" target="_blank">sofridamente</a>. </p>
<p>Inclusive alguns entusiastas do <a href="http://www.ruby-lang.org/" target="_blank">Ruby</a> mais afoitos (A.K.A novatos) fazem bastante algazarra em listas de discuss&otilde;es de como conseguem fazer uma itera&ccedil;&atilde;o ou outra opera&ccedil;&atilde;o espec&iacute;fica com menos linha de c&oacute;digo que linguagens como Java ou C++. Claro que &eacute; perda de tempo total tentar dialogar e mostrar a necessidade da escolha ideal para o determinado prop&oacute;sito, os programadores de verdade sabem que Ruby tamb&eacute;m n&atilde;o ser&aacute; o fim dos tempos, conceitos surgir&atilde;o e retornar&atilde;o dependendo da situa&ccedil;&atilde;o.</p>
<p>Outra situa&ccedil;&atilde;o depende do ambiente, como simular <a href="http://en.wikipedia.org/wiki/Model-view-controller" target="_blank">MVC</a> em uma ambiente web, devido a diferen&ccedil;a de contexto do ambiente http em detrimento ao ambiente standalone de um desktop surgiu o famigerado <a href="http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html" target="_blank">MVC model 2</a> que deu cria a aberra&ccedil;&otilde;es como Struts e derivados. Isso hoje pode ser <a href="http://ajaxian.com/archives/dwr-20-reverse-ajax" target="_blank">contornado</a> mas ainda &eacute; incipiente.</p>
<p>Na mesma forma acontece com padr&otilde;es, como o contexto de uma linguagem est&aacute; atrelada a determinado ambiente &eacute; vital incorporar conceitos deste contexto na sua sem&acirc;ntica e deixar a extens&atilde;o para o desenvolvedor do que ser gen&eacute;rica e causar improdutividade com tarefas repetitivas, vide sucesso do ruby na constru&ccedil;&atilde;o de aplica&ccedil;&otilde;es web com o <a href="http://www.rubyonrails.org/" target="_blank">Ruby On Rails</a>.</p>
<p>Em diversas &eacute;pocas os padr&otilde;es como Singleton e Factory v&atilde;o e voltam com desenvoltura, em momento amado e indispens&aacute;vel, outro odiado e suplantado. Mas s&atilde;o padr&otilde;es universais para resolver um determinado problema, catalogado e dispon&iacute;vel para quando forem requisitados.</p>
<p>Padr&otilde;es s&atilde;o assim, como quase tudo na vida, desnecess&aacute;rios as vezes e se usados com modera&ccedil;&atilde;o s&atilde;o ben&eacute;ficos. Como dizia minha v&oacute;, &quot;<em>tudo demais &eacute; veneno</em>&quot;.
</p>
<p><!--e15e8e37d0c3ac1e602c62478ffe6e63--><!--c9591a786b8591482aa8573c201491f7--><!--13c17d1f9f10d8c20c82fad8560aca4e--><!--43da406ea9d3be4724a50edbd710ac0e--><!--161f92d83fe99d59f14632dfbd67a1cb--><!--e652b3182dd5caa6a7efdd04cd4bfe2b--><!--c5ca7169347f89f97a4e85c45264100c--><!--ebde3beb67fa999b169ed5692550681d--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/blog/archives/111/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Persistencia em um domain model</title>
		<link>http://www.milfont.org/blog/archives/31</link>
		<comments>http://www.milfont.org/blog/archives/31#comments</comments>
		<pubDate>Thu, 18 May 2006 03:24:46 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de software]]></category>
		<category><![CDATA[Test-Driven development]]></category>

		<guid isPermaLink="false">http://www.amigos-list.org/~cmilfont/?p=31</guid>
		<description><![CDATA[Ultimamente estou usando uma abordagem diferente para a persistência. vinha adotando os pattern de ActiveRecord e Repository além do DataMapper popularmente conhecido como DAO. Aperfeiçoei com essa dica do CV no guj. Apesar da persistência ser arquitetural e teoricamente não fazer parte do dominio dos seus processos de negócios, invariavelmente é a maior preocupação na [...]]]></description>
			<content:encoded><![CDATA[<p>Ultimamente estou usando uma abordagem diferente para a persistência. vinha adotando os pattern de <a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html">ActiveRecord</a> e <a href="http://www.martinfowler.com/eaaCatalog/repository.html">Repository</a> além do <a href="http://www.martinfowler.com/eaaCatalog/dataMapper.html">DataMapper</a> popularmente conhecido como DAO. Aperfeiçoei com essa dica do <a href="http://www.guj.com.br/posts/list/15/20668.java">CV</a> no guj.<br />
Apesar da persistência ser arquitetural e teoricamente não fazer parte do dominio dos seus processos de negócios, invariavelmente é a maior preocupação na construção de um software o &#8220;como&#8221; e &#8220;onde&#8221; um objeto tem que mudar seu estado persistido. Em outras palavras como isolar a persistência de seu domain model para que a transparência dessa operação diminua o código sem aumentar os pontos de manutenção com alta coesão e fraco acoplamento.</p>
<p><strong>Estados do objeto</strong><br />
Os objetos do ponto de vista do modelo de um processo apresentam estados, como excluído, alterado e criado. Podemos adotar o conceito de Active Record no domain model e fazer com que seus objetos implementem uma interface que sem criatividade no momento chamarei de ActiveRecord:</p>
<pre>
public interface ActiveRecord {
	public void carregado();
	public void novo();
	public void alterado();
	public void excluido();
}
</pre>
<p>Podemos então criar uma classe abstrata seguindo o pattern <a href="http://www.guj.com.br/java.coluna.7.1.guj">Template Method</a> para criar uma estrutura básica para todos nossos objetos que chamarei de AbstractActiveRecord:</p>
<pre>
public abstract class AbstractActiveRecord < t extends AbstractActiveRecord >
		implements ActiveRecord {

	public void carregado() {
		Repository.carregar(this);
	}

	public void alterado() {
		Repository.alterar(this);
	}
...
}
</pre>
<p>Resolvi chamar o Repository dentro do Template do ActiveRecord para deixar isolado os DAOs da aplicação de criar apenas um ponto de manutenção em comum.<br />
O conceito de Repository deixa o sistema isolado da infraestrutura de persistência funcionando como um espécie de banco de dados em memória que os objetos se dirigem ao perguntar por alguém (Alguém esse referente a uma entidade do dominio).<br />
Observe que as classes do meu sistema devem extender a classe AbstractActiveRecord e implentar a interface ActiveRecord, mas isso não é se prender a um framework, porque essas classes fazem parte do dominio apesar de existirem para resolver um problema arquitetural, elas são do meu sistema, e estão independente de infraestrutura porque são relativos do dominio de qualquer forma.<br />
Uma entidade do meu sistema fica assim:</p>
<pre>
public final class Cliente extends AbstractActiveRecord implements ActiveRecord {
	private int id;
	private String nome;
	private String cpf;
	//gets e sets
}
</pre>
<p>O <a href="http://www.fragmental.com.br">Shoes</a> tinha me dado um conselho de usar o Repository junto com o Active Record e DataMapper a um tempo atrás para isolar o modelo da persistência principalmente na lista de entidades, exemplo:<br />
Cliente cliente = RepositorioClientes.carregaListaClientes();<br />
Mas eu resolvi criar um repositório genérico para todas as entidades e dentro dele inserir uma chamada a uma fábrica de DAOs apropriado dependendo do tipo o objeto. Código do meu Repository:</p>
<pre>
public abstract class Repository {
	public static void carregar(ActiveRecord record) {
		System.out.println("carregou quem? " + record.getClass().getName());
		//faz o trabalho de persistencia... pode fazer injeção etc...
		//pode chamar uma Fabrica para criar o DAO a partir da classe
		// FabricaDAO.criarDAO(record.getClass());
	}
...
}
</pre>
<p>realizando um teste simples para ver como se comportaria:</p>
<pre>
public class TransacaoTest extends TestCase {
	public void testTransacao(){
		Cliente christiano = new Cliente();
		christiano.setNome("christiano");
		christiano.setCpf("999.999.999-99");
		christiano.novo();
		assertEquals(1, christiano.getId());
		//acontece mais algumas coisas...
		//e lá pelas tantas...
		christiano.setNome("Christiano Martins");
		christiano.alterado();
		assertEquals("Christiano Martins", christiano.getNome());
	}
}
</pre>
<p>O resultado foi como esperado, o processo vai modificando o estado dos objetos durante a transação e tornando o código mais legível, evitando chamar DAO dentro do meu modelo ou misturar código de framework como Hibernate ao meu domínio.<br />
Com exemplos simples em transação praticamente CRUD a coisa funciona legal, quando precisamos alterar ou pra Lazy Loading ou Eager Loading dependendo do padrão da aplicação (deixo como padrão lazy), passamos um parâmetro para a estrutura como por exemplo:</p>
<pre>
normal
Cliente cliente = new Cliente(10); // esse construtor já invoca a estrutura e carrega as informações
com lazy Loading
Cliente cliente = new Cliente(10, ActiveRecord.LAZY_LOADING);
...
Construtor normal:
	public Cliente(int id) {
		super();
		this.id = id;
		this.carregado();
	}
Construtor parametrizavel
	public Cliente(int id, int LOADED_PARAMETER) {
		super();
		this.id = id;
		this.carregado(LOADED_PARAMETER);
	}
...
</pre>
<p>De qualquer forma podemos criar uma estrutura de modelo do domínio do meu processo isolada da arquitetura tecnológica facilitando a manutenção com padrões de projetos simples, código mais enxuto e transparência nas transações.<!--a6704c645b4757c59d86220d0229e457--><!--977d552da37d85b8b0399295b39fa09e--><!--8aef7dcd6e13efc1dd871500c9982b88--><!--b3555539e9fc0f280646d3e8ccf974e0--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/blog/archives/31/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Padrões de projeto de software</title>
		<link>http://www.milfont.org/blog/archives/16</link>
		<comments>http://www.milfont.org/blog/archives/16#comments</comments>
		<pubDate>Tue, 01 Nov 2005 20:19:26 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Design Patterns]]></category>

		<guid isPermaLink="false">http://www.amigos-list.org/~cmilfont/?p=16</guid>
		<description><![CDATA[Uma dificuldade que tenho, e acredito que muitos tem, é de encontrar códigos simples implementados com conceitos de padrões de projeto de desenvolvimento de software, por isso postarei aqui toda semana um exemplo de como implementei algo nesse contexto, de forma que venha ajudar a quem está iniciando no aprendizado e para aqueles que já [...]]]></description>
			<content:encoded><![CDATA[<p>Uma dificuldade que tenho, e acredito que muitos tem, é de encontrar códigos simples implementados com conceitos de padrões de projeto de desenvolvimento de software, por isso postarei aqui toda semana um exemplo de como implementei algo nesse contexto, de forma que venha ajudar a quem está iniciando no aprendizado e para aqueles que já implementaram podendo contribuir com melhorias no conceito ou sugestões.<br />
Não quero me alongar em histórico de design patterns ou forma técnica de demonstrar um pattern, explicando contexto, problema, solução, etc. Para isso aconselho aos livros clássicos sobre o assunto ou pesquisas em portais que tratam os patterns dessa forma. Vou direto para a dica de implementação com apenas um pequeno descritivo da necessidade de tal padrão.</p>
<p><strong>Necessidade</strong><br />
Para esse artigo inicial vou demonstrar como solucionei uma necessidade de paginação de forma reaproveitavél utilizando os fundamentos da programação orientada a objetos.<br />
O exemplo está utilizando JAVA como linguagem mas pode muito bem ser utilizada em outras linguagens orientadas a objetos.</p>
<p><strong>Padrões</strong><br />
Para solucionar essa necessidade utilizei o Pattern Iterator e o Template Method.</p>
<p><strong>Implementação</strong><br />
Primeiro criei uma <em>Interface</em> onde defini quais métodos seriam implentados para essa necessidade.</p>
<p>Código&#8230;</p>
<p><img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/ValueListIterator.PNG" alt="Interface" /></p>
<p>Classe de Exception auxiliar&#8230;</p>
<p><img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/IteratorException.PNG" alt="Exception" /></p>
<p>Então criei uma classe Abstrata que implementa métodos comuns a todas as classes concretas que venham  a extendê-la. Um detalhe é que utilizei o conceito de Template Method e deixei alguns métodos a serem implamentados na classe concreta, dessa forma controlo o funcionamento interno de navegação da paginação e deixo aberto para extensão de especificidades da aplicação do programador.</p>
<p>Códigos da classe abstrata&#8230;</p>
<p><img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/ValueListHandler_1.PNG" alt="1" /><br />
<img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/ValueListHandler_2.PNG" alt="2" /><br />
<img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/ValueListHandler_3.PNG" alt="3" /><br />
<img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/ValueListHandler_4.PNG" alt="4" /><br />
<img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/ValueListHandler_5.PNG" alt="5" /></p>
<p>Observe que não implementei os métodos:<br />
    <strong>public String getCmd();</strong><br />
    <strong>public void setCmd(String cmd);</strong><br />
    <strong>public Collection getGrid();</strong><br />
deixando a cargo do programador implementá-los.</p>
<p>Não pretendo me ater sobre as funcionalidades de cada método, devo apenas ressaltar que o inteiro cache é relativo ao número de elementos da lista por página.</p>
<p><strong>Utilização</strong><br />
Vejamos como utilizar essa estrutura:</p>
<p>Vamos criar uma classe que seja uma lista de objetos a serem percorridos na paginação.<br />
Essa classe terá que implementar nossa Interface e estender a classe abstrata.</p>
<p>Código da classe&#8230;</p>
<p><img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/EquipeListHandler.PNG" alt="EquipeListHandler" /></p>
<p>Vejam que tive que implementar os métodos que a classe abstrata não fez por conta da obrigatoriedade que a Interface causa por implementá-la. Criei um construtor que recebe uma lista de valores e o número de elementos que aparecem em cada página.</p>
<p>Voce instancia em seu controle da seguinte forma:</p>
<p><img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/Business.PNG" alt="Business" /></p>
<p>Esse código é apenas um exemplo de como utilizar a estrutura, existem mais possibilidades.</p>
<p>Na página jsp eu poderia acessá-lo da seguinte forma:</p>
<p><img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/jsp.PNG" alt="jsp" /></p>
<p>Utilizo uma variação na criação do Manipulador (Handler), usando uma fábrica para encontrar a classe exata.<br />
Exemplo&#8230;</p>
<p><strong>ValueListIterator equipeHandler = ListFactory.getListIterator(&#8220;Equipe&#8221;);</strong><br />
<strong>equipeHandler.setTamanhoCache(10);</strong><br />
<strong>equipeHandler.setList(&#8230;);</strong></p>
<p>Depois testo se o objeto já está instanciado e se estiver seto o comando especifico.<br />
<strong>equipeHandler.setCmd(acao);</strong></p>
<p>Código da Fabrica&#8230;</p>
<p><img src="http://www.amigos-list.org/~cmilfont/imagens/pattern1/ListFactory.PNG" alt="ListFactory" /></p>
<p>Espero não ter complicado por falta de explicações maiores, mas eu queria somente demonstrar como utilizei determinados Padrões na resolução de uma necessidade específica.</p>
<p><strong>Referências</strong></p>
<p><a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html">http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html</a><br />
<a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html">http://java.sun.com/blueprints/corej2eepatterns/Patterns/ValueListHandler.html</a><br />
<a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html">http://www.corej2eepatterns.com/catalog.htm</a><br />
<a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html">http://www.corej2eepatterns.com/Patterns2ndEd/ValueListHandler.htm</a><br />
<a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html">http://www.javamagazine.com.br/edicoes/jm21/index.jsp</a><br />
<a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/index.html">http://www.javamagazine.com.br/edicoes/jm20/index.jsp</a></p>
<p>Excelente, de onde retirei grande parte do conceito.<br />
<a href="http://www.mundooo.com.br/php/modules.php?name=News&#038;file=article&#038;sid=512">http://www.mundooo.com.br/php/modules.php?name=News&#038;file=article&#038;sid=512</a></p>
<p><strong>Download do código do artigo</strong><br />
<a href="http://www.amigos-list.org/~cmilfont/source/src_pattern_1.zip">http://www.amigos-list.org/~cmilfont/source/src_pattern_1.zip</a><!--85d1f07e8c039597048defb50a364aa2--><!--34710a62cb51878c41b684cf448b1ccc--><!--413fa33a9a829b3e1e249933b59207b5--><!--6639c571fceb3a9899c4ea268f198032--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/blog/archives/16/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

