<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Design Patterns</title>
	<atom:link href="http://designpatternsbowl.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://designpatternsbowl.wordpress.com</link>
	<description>Danilo Sanches &#38; Leonardo Rocha</description>
	<lastBuildDate>Mon, 08 Jun 2009 02:43:10 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='designpatternsbowl.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Design Patterns</title>
		<link>http://designpatternsbowl.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://designpatternsbowl.wordpress.com/osd.xml" title="Design Patterns" />
	<atom:link rel='hub' href='http://designpatternsbowl.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Trabalho da Disciplina Projeto e Tópicos Especiais em Projeto de Sistemas de Software</title>
		<link>http://designpatternsbowl.wordpress.com/2009/06/06/trabalho-da-disciplina-projeto-e-topicos-especiais-em-projeto-de-sistemas-de-software/</link>
		<comments>http://designpatternsbowl.wordpress.com/2009/06/06/trabalho-da-disciplina-projeto-e-topicos-especiais-em-projeto-de-sistemas-de-software/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 14:58:21 +0000</pubDate>
		<dc:creator>lsrocha</dc:creator>
				<category><![CDATA[Padrão Observer]]></category>

		<guid isPermaLink="false">http://designpatternsbowl.wordpress.com/?p=17</guid>
		<description><![CDATA[  Implementação de uma Pista de Boliche em JAVA utilizando o Pattern Observer   Autores Danilo Sanches de Lima Leonardo Santos Rocha 1.  Introdução No desafio proposto pelo professor da disciplina de Projeto e Tópicos Especiais em Projeto de Sistemas de Software, André Santanchè, do Curso de Pós-Graduação em Engenharia de Software da Unifacs, de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=designpatternsbowl.wordpress.com&amp;blog=8048590&amp;post=17&amp;subd=designpatternsbowl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong> </strong></p>
<h2 class="mceTemp mceIEcenter" style="text-align:center;">Implementação de uma Pista de Boliche em JAVA utilizando o Pattern Observer</h2>
<p> </p>
<h1>Autores</h1>
<ul>
<li>Danilo Sanches de Lima</li>
<li>Leonardo Santos Rocha</li>
</ul>
<h1>1.  Introdução</h1>
<p>No desafio proposto pelo professor da disciplina de Projeto e Tópicos Especiais em Projeto de Sistemas de Software, André Santanchè, do Curso de Pós-Graduação em Engenharia de Software da Unifacs, de implementar um programa utilizando Padrões de Projeto ou um Estilo Arquitetural, possuíamos uma idéia do que poderíamos implementar. Uma vez que um dos integrantes da equipe pratica boliche, resolvemos implementar um protótipo de um simulador de jogadas de Boliche. Este programa, desenvolvido em Java, é composto de 3 classes e implementa o padrão Observer. Nas seções seguintes, descrevemos o padrão, o conceito e o código do sistema.</p>
<h1>2.  O padrão Observer</h1>
<p style="text-align:left;"><em>“O padrão Observer define a dependência um-para-muitos entre objetos para que quando um objeto mude de estado todos os seus dependentes sejam avisados e atualizados automaticamente.” </em>[Gamma,98]<em> </em></p>
<p style="text-align:left;">Conforme definição de Erich Gamma, dado um conjunto de objetos, alguns destes terão atributos que definirão o seu estado. Neste caso é caracterizada a relação: Observado (Subject) X Observador (Observer). O primeiro se comporta definindo seu estado e o segundo será avisado dos estados do primeiro.</p>
<p style="text-align:center;"> <img class="size-full wp-image-21    aligncenter" title="diagrama_do_padrao" src="http://designpatternsbowl.files.wordpress.com/2009/06/diagrama_do_padrao1.jpg?w=431&#038;h=260" alt="diagrama_do_padrao" width="431" height="260" /></p>
<p style="text-align:left;"> </p>
<p>O padrão também é conhecido por: <em>Dependents, Publish-Subscribe</em></p>
<h1>3.  O BowlingObserver</h1>
<p>Levamos em consideração o formato de um jogo de boliche, que basicamente é constituído de Jogadores, Pista, Bola e Pinos, e que seu funcionamento é baseado em jogadas, feita por um jogador através de arremesso de uma bola numa pista em direção à 10 pinos. O objetivo seria derrubar estes pinos.</p>
<p> A partir do conceito de funcionamento do <em>Observer,</em> consideramos que o padrão seria o que mais se adequaria ao modelo implementado, uma vez que  temos a figura dos pinos que possuem os estados “derrubados” e “em pé”, e o jogador, autor da jogada, como um observador que contará pontos conforme os estados dos pinos após um lançamento.</p>
<h2>Sujeito x Observador</h2>
<p>No modelo implementado, consideramos o objeto observado, ou Sujeito, a própria pista. Isto porque, apesar de os pinos possuírem os seus estados, é ela que contém como atributo o seu próprio conjunto de pinos, e consequentemente sofre a jogada. Neste caso, será ela a responsável por alertar ao Observador o estado de cada um dos seus dez pinos.</p>
<p>Num jogo de boliche, um jogador pode efetuar jogadas em mais de uma pista. Sendo assim, a classe pista, poderá ser instanciada “n” vezes, o que permite que o jogador observe os estados de pinos de todas as pistas em que ele efetuou a jogada.</p>
<p style="text-align:center;"><img class="size-full wp-image-22  aligncenter" title="uc" src="http://designpatternsbowl.files.wordpress.com/2009/06/uc.jpg?w=375&#038;h=142" alt="uc" width="375" height="142" /></p>
<h1>4.  Implementação do BowlingObserver</h1>
<p>O programa foi desenvolvido em JAVA, primeiramente devido ao domínio da  linguagem pela equipe e também porque o JAVA oferece, no seu pacote java.util, estruturas que possibilitam implementação do padrão <em>Observer, </em>que são a classe Observable e a interface a Observer<em>. </em></p>
<p>Foram então implementadas as classes descritas na seção anterior, Pinos, Pista e Jogador. Sendo que Pista é uma classe herdeira de Observable, que contém como atributos uma serie de Pinos, e Jogador é uma classe que implementa a interface Observer. O diagrama de classes do programa é descrito na figura 3.</p>
<p style="text-align:center;"> <img class="aligncenter size-full wp-image-35" title="diagrama" src="http://designpatternsbowl.files.wordpress.com/2009/06/diagrama.jpg?w=638&#038;h=512" alt="diagrama" width="638" height="512" /></p>
<p style="text-align:center;"> </p>
<h2 style="margin:12pt 0 3pt;"><span style="font-style:normal;"><span style="font-size:large;"><span style="font-family:Arial;">Pista – O Observable</span></span></span></h2>
<p class="MsoNormal" style="text-align:justify;margin:0;"><span style="font-family:Arial,sans-serif;"><span style="font-size:small;">Nesta seção demonstramos a implementação da classe Pista, conforme o diagrama da fig. 4</span></span></p>
<p class="MsoNormal" style="text-align:center;margin:0;" align="center"> </p>
<p> </p>
<p style="text-align:center;"> <img class="aligncenter size-full wp-image-28" title="pista" src="http://designpatternsbowl.files.wordpress.com/2009/06/pista.jpg?w=211&#038;h=285" alt="pista" width="211" height="285" /></p>
<p>A classe é descrita como <strong>public</strong> <strong>class</strong> Pista <strong>extends</strong> Observable possui os dez atributos do tipo Pino. Estes são inicializados na própria declaração deles.</p>
<p> O método <strong>jogarBola(List&lt;Integer&gt; pinos)</strong> receberá uma lista de inteiros representando os números dos pinos derrubados. Caso esta lista esteja vazia, significa que ou nenhum pino foi derrubado, ou se trata da arrumação inicial  dos mesmos.</p>
<p><strong> </strong><strong>public</strong> <strong>void</strong> jogarBola(List&lt;Integer&gt; pinos){         </p>
<p>            <strong>for</strong>(Integer p : pinos){</p>
<p>                  <strong>switch</strong>(p){</p>
<p>                  <strong>case</strong> (1):                   </p>
<p>                        <strong>this</strong>.pin1.setDerrubado(<strong>true</strong>);</p>
<p>                        <strong>break</strong>;</p>
<p>                  <strong>case</strong> (2):</p>
<p>                        <strong>this</strong>.pin2.setDerrubado(<strong>true</strong>);</p>
<p>                        <strong>break</strong>;     </p>
<p>                  <strong>case</strong> (3):</p>
<p>                          <strong>this</strong>.pin3.setDerrubado(<strong>true</strong>);</p>
<p>                          <strong>break</strong>;   </p>
<p>                  <strong>case</strong> (4):</p>
<p>                          <strong>this</strong>.pin4.setDerrubado(<strong>true</strong>);</p>
<p>                          <strong>break</strong>;   </p>
<p>                  <strong>case</strong> (5):</p>
<p>                          <strong>this</strong>.pin5.setDerrubado(<strong>true</strong>);</p>
<p>                          <strong>break</strong>;   </p>
<p>                  <strong>case</strong> (6):</p>
<p>                          <strong>this</strong>.pin6.setDerrubado(<strong>true</strong>);</p>
<p>                          <strong>break</strong>;   </p>
<p>                  <strong>case</strong> (7):</p>
<p>                          <strong>this</strong>.pin7.setDerrubado(<strong>true</strong>);</p>
<p>                          <strong>break</strong>;   </p>
<p>                  <strong>case</strong> (8):</p>
<p>                          <strong>this</strong>.pin8.setDerrubado(<strong>true</strong>);</p>
<p>                          <strong>break</strong>;   </p>
<p>                  <strong>case</strong> (9):</p>
<p>                          <strong>this</strong>.pin9.setDerrubado(<strong>true</strong>);</p>
<p>                          <strong>break</strong>;</p>
<p>                  <strong>case</strong> (10):</p>
<p>                          <strong>this</strong>.pin10.setDerrubado(<strong>true</strong>);</p>
<p>                          <strong>break</strong>;                              </p>
<p>                  }          </p>
<p>            }</p>
<p>            derrubouPinos();</p>
<p>      }</p>
<p> </p>
<p>Ao final deste método é evocado o método <strong>derrubouPinos()</strong>. Este método é o mais importante para o funcionamento do padrão, pois é ele quem vai alertar ao Observer os novos estados dos Pinos.</p>
<p><strong> </strong></p>
<p><strong>public</strong> <strong>void</strong> derrubouPinos() {</p>
<p>      setChanged(); //indica que o estado do objeto mudou.</p>
<p>notifyObservers();//Notifica ao observer que o estado do Objetos mudou</p>
<p>      }</p>
<p> </p>
<p>Através do método <strong>displayPista()</strong> é impressa no console a organização dos pinos conforme os seus estados. Caso, o pino esteja derrubado, ele não será impresso no conjunto.</p>
<p><strong> </strong></p>
<p><strong>public</strong> <strong>void</strong> displayPista(){</p>
<p>String display = getPin7().getNumber()+&#8221; &#8220;+getPin8().getNumber()+&#8221; &#8220;+getPin9().getNumber()+&#8221; &#8220;+getPin10().getNumber()+&#8221; &#8221; +&#8221;\n&#8221;          </p>
<p>+&#8221; &#8221; +getPin4().getNumber() + &#8221; &#8221; + getPin5().getNumber()+ &#8221; &#8221; + getPin6().getNumber()+ &#8220;\n&#8221;</p>
<p>      +&#8221;  &#8220;+ getPin2().getNumber()+&#8221; &#8220;+ getPin3().getNumber()+&#8221; &#8220;+&#8221;\n&#8221;</p>
<p>      + &#8220;   &#8220;+getPin1().getNumber();</p>
<p>           </p>
<p>            System.<em>out</em>.println(display);</p>
<p> </p>
<p>/* 7 8 9 10</p>
<p> *  6 5 4</p>
<p> *   3 2</p>
<p> *    1</p>
<p> */</p>
<p> </p>
<p>      }</p>
<p>     </p>
<p>O que determina se o Pino será impresso ou não, é o valor do seu atributo, juntamente com o comportamento do método getNumber().</p>
<p><strong> </strong></p>
<p><strong>public</strong> String getNumber() {</p>
<p>          <strong>if</strong>(isDerrubado()){</p>
<p>                <strong>return</strong> &#8221; &#8220;;</p>
<p>          }<strong>else</strong>{</p>
<p>                <strong>return</strong> number;</p>
<p>          }</p>
<p> </p>
<p>Os métodos setChanged() e notifyObservers() são métodos da superclasse Observable (fig. 3).</p>
<h2>Jogador – O Observer</h2>
<p>A classe Jogador descrita como <strong>public</strong> <strong>class</strong> Jogada <strong>implements</strong> Observer é demonstrada na fig. 5.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-30" title="jogador" src="http://designpatternsbowl.files.wordpress.com/2009/06/jogador.jpg?w=309&#038;h=117" alt="jogador" width="309" height="117" /></p>
<p>Um dos métodos mais importantes para o funcionamento do <em>Observer</em> é o próprio construtor da classe. É nele que vai ser determinado qual é o objeto <em>observable</em>.</p>
<p> <strong>public</strong> Jogador(Observable observable){</p>
<p>       <strong>this</strong>.observable = observable;</p>
<p>       observable.addObserver(<strong>this</strong>);</p>
<p>}</p>
<p> </p>
<p>Pode-se notar que o atributo observable recebe o parâmetro observable do construtor, bem como adiciona uma instância de Jogador na sua lista de <em>Observers </em>através do método addObserver(Observer o).</p>
<p> O resultado do funcionamento do padrão, esta justamente no método update().  Este método é disparado através da chamada do notifyObservers(). Outra possibilidade para disparar o update(), seria configurar o próprio Sujeito para chamar o notify() após uma mudança de estado. No entanto a vantagem deste optado é que a chamada do notify() pode ser executada após todas a mudanças executadas conforme o objetivo do negócio [Gamma,98].</p>
<p><strong> </strong><strong>public</strong> <strong>void</strong> update(Observable obs, Object arg ) {</p>
<p>            <strong>if</strong> ( obs <strong>instanceof</strong> Pista ) {</p>
<p>                  Pista p = (Pista) obs;            </p>
<p>                  p.displayPista();</p>
<p>             }</p>
<p> </p>
<p>Dentro do <strong>update() </strong>instanciamos um objeto Pista e chamamos o método displayPista(), desta forma visualizaremos no console, após as mudanças de estado, os pinos que estão “em pé”. Mais a frente, poderemos notar que este método (update()) não será chamado em nenhum momento no programa e sim implicitamente através do notifyObservers().</p>
<p> </p>
<h2>A execução do programa</h2>
<p>Para executar o programa implementamos o método <strong>main</strong> na própria classe Jogador. Esta opção foi feita apenas para comprovar o funcionamento do programa, o que posteriormente deverá ser realocado para outra classe.</p>
<p> </p>
<p><strong>public</strong> <strong>static</strong> <strong>void</strong> main(String args[]){</p>
<p>            List&lt;Integer&gt; pinos= <strong>new</strong> ArrayList&lt;Integer&gt;(0);           </p>
<p>            Pista pista = <strong>new</strong> Pista();        </p>
<p>            Jogada j = <strong>new</strong> Jogada(pista);</p>
<p>            System.<em>out</em>.println(&#8220;PISTA PRONTA&#8221;);</p>
<p>            System.<em>out</em>.println(&#8220;##############&#8221;);</p>
<p>            pista.jogarBola(pinos);</p>
<p>            System.<em>out</em>.println(&#8220;##############&#8221;);</p>
<p>            System.<em>out</em>.println(&#8220;BOLA LANÇADA&#8230;&#8221;);  </p>
<p>            System.<em>out</em>.print(&#8220;PINOS DERRUBADOS : &#8220;);</p>
<p>            <strong>for</strong>(String s : args){</p>
<p>                  System.<em>out</em>.print(s+&#8221; &#8220;);</p>
<p>                  Integer pino = <strong>new</strong> Integer(s);</p>
<p>                  pinos.add(pino);</p>
<p>            }</p>
<p>            System.<em>out</em>.println(&#8220;&#8221;);</p>
<p>            System.<em>out</em>.println(&#8220;PISTA COM PINOS RESTANTES&#8221;);</p>
<p>            System.<em>out</em>.println(&#8220;##############&#8221;);</p>
<p>            pista.jogarBola(pinos);</p>
<p>            System.<em>out</em>.println(&#8220;##############&#8221;);                     </p>
<p> </p>
<p>      }</p>
<p> </p>
<p>Neste código, iniciamos a jogada através da primeira chamada de pista.jogarBola(pinos)<strong>. </strong>Como a lista pinos está vazia, o programa posiciona os pinos na ordem antes da jogada.</p>
<p>Após <em>“BOLA LANÇADA”</em> e “<em>PINOS DERRUBADOS:</em>”, percorremos a lista parâmetros através de um <strong><em>for</em> </strong>e preenchemos a lista pinos. Ao executar novamente pista.jogarBola(pinos) é impressa a nova organização dos pinos após a jogada.</p>
<p>É importante notar que no método <strong>jogarBola()</strong> não possui em seu código a chamada para o método <strong>displayPista()</strong>, no entanto a pista é impressa mesmo após a jogada. Isso se deve a chamada de <strong>derrubouPinos()</strong> que chama os métodos <strong>setChanged()</strong> e <strong>notifyObservers()</strong>. Este último disparará o método <strong>update()</strong> que possui a chamada para <strong>displayPista()</strong> e produzirá o resultado demonstrado na figura 6.</p>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-31" title="tela" src="http://designpatternsbowl.files.wordpress.com/2009/06/tela.jpg?w=422&#038;h=324" alt="tela" width="422" height="324" /></p>
<h1>5. Vídeo</h1>
<h1 style="text-align:center;"><span style="text-align:center; display: block;"><a href="http://designpatternsbowl.wordpress.com/2009/06/06/trabalho-da-disciplina-projeto-e-topicos-especiais-em-projeto-de-sistemas-de-software/"><img src="http://img.youtube.com/vi/x80eYgSLzcA/2.jpg" alt="" /></a></span></h1>
<h1>6.  Referências</h1>
<p>Gamma, E. Helm, R. Johnson, R. Vlissides, J. &#8211; Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1998.</p>
<p> <a href="http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/arqu/observer.htm">http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/arqu/observer.htm</a>.</p>
<p> Acessado em 03 de junho de 2009</p>
<p> <a title="Posts de MarioSAM" href="http://www.mariosam.com/author/admin/">MarioSAM</a>, <a title="Link permanente para Design Patterns - Padrão Observer" href="http://www.mariosam.com/designpatterns/design-patterns-padrao-observer">Design Patterns &#8211; Padrão Observer </a>- 05 dezembro 2008 as 2:33</p>
<p>http://www.mariosam.com/designpatterns/design-patterns-padrao-observer .</p>
<p>Acessado em 03 de junho de 2009</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/designpatternsbowl.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/designpatternsbowl.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/designpatternsbowl.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/designpatternsbowl.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/designpatternsbowl.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/designpatternsbowl.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/designpatternsbowl.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/designpatternsbowl.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/designpatternsbowl.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/designpatternsbowl.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/designpatternsbowl.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/designpatternsbowl.wordpress.com/17/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/designpatternsbowl.wordpress.com/17/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/designpatternsbowl.wordpress.com/17/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=designpatternsbowl.wordpress.com&amp;blog=8048590&amp;post=17&amp;subd=designpatternsbowl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://designpatternsbowl.wordpress.com/2009/06/06/trabalho-da-disciplina-projeto-e-topicos-especiais-em-projeto-de-sistemas-de-software/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/ef11f5123c46681796623c7f11252938?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">lsrocha</media:title>
		</media:content>

		<media:content url="http://designpatternsbowl.files.wordpress.com/2009/06/diagrama_do_padrao1.jpg" medium="image">
			<media:title type="html">diagrama_do_padrao</media:title>
		</media:content>

		<media:content url="http://designpatternsbowl.files.wordpress.com/2009/06/uc.jpg" medium="image">
			<media:title type="html">uc</media:title>
		</media:content>

		<media:content url="http://designpatternsbowl.files.wordpress.com/2009/06/diagrama.jpg" medium="image">
			<media:title type="html">diagrama</media:title>
		</media:content>

		<media:content url="http://designpatternsbowl.files.wordpress.com/2009/06/pista.jpg" medium="image">
			<media:title type="html">pista</media:title>
		</media:content>

		<media:content url="http://designpatternsbowl.files.wordpress.com/2009/06/jogador.jpg" medium="image">
			<media:title type="html">jogador</media:title>
		</media:content>

		<media:content url="http://designpatternsbowl.files.wordpress.com/2009/06/tela.jpg" medium="image">
			<media:title type="html">tela</media:title>
		</media:content>
	</item>
	</channel>
</rss>
