<?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>Marioosh&#039;s developer diary &#187; Wzorce Projektowe</title>
	<atom:link href="http://marioosh.5dots.pl/category/programowanie/dpat/feed/" rel="self" type="application/rss+xml" />
	<link>http://marioosh.5dots.pl</link>
	<description>or something like this</description>
	<lastBuildDate>Mon, 06 Sep 2010 16:23:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Wzorce Projektowe, źródło książkowe</title>
		<link>http://marioosh.5dots.pl/2010/08/wzorce-projektowe-zrodlo-ksiazkowe/</link>
		<comments>http://marioosh.5dots.pl/2010/08/wzorce-projektowe-zrodlo-ksiazkowe/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 14:39:48 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Head First]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=552</guid>
		<description><![CDATA[Znajomość wzorców projektowych zdaje się być jedną z ważniejszych umiejętności posiadanych przez wprawnego programistę. Dlaczego jest zatem tak, że nie każdy programista je zna? Składa się na to kilka współczynników. Po pierwsze: wzorce wymagają pewnego doświadczenia programistycznego, aby podczas nauki można było znaleźć dla nich praktyczne zastosowanie. Po drugie: oryginalna książka bandy czworga jest śmiertelnie [...]]]></description>
			<content:encoded><![CDATA[<p>Znajomość wzorców projektowych zdaje się być jedną z ważniejszych umiejętności posiadanych przez wprawnego programistę. Dlaczego jest zatem tak, że nie każdy programista je zna? Składa się na to kilka współczynników. Po pierwsze: wzorce wymagają pewnego doświadczenia programistycznego, aby podczas nauki można było znaleźć dla nich praktyczne zastosowanie. Po drugie: oryginalna książka bandy czworga jest śmiertelnie nudna i nauka wzorców z tej książki wymaga solidnego samozaparcia. Te czynniki sprawiają, że nawet jak wzorce są omawiane na studiach, to studenci w większym stopniu o nich zapominają. Zostaje zatem samonauczanie podczas swojej pracy &#8211; poznając wzorce szukamy dla nich praktycznego zastosowania w obecnym projekcie. </p>
<p>Gdzie jednak szukać dobrego źródła na ten temat? Jeżeli szukamy wśród pozycji książkowych to godną polecenia pozycją jest: <a href="http://helion.pl/ksiazki/head_first_design_patterns_edycja_polska_rusz_glowa_eric_freeman_elisabeth_freeman_kathy_sierra_bert_bates,hfdepa.htm">Head First Design Patterns</a>. Mimo, iż jest to chyba jedyna pozycja na polskim rynku dotycząca tego tematu, to zdecydowanie jest godna polecenia. Książka pisana w dość luźnym stylu wyjaśnia stosowanie wzorców na praktycznych przykładach. Budując krok po kroku fragmenty kodu czytelnik widzi te same funkcjonalności zarówno z wykorzystaniem wzorców jak i bez nich. Jest to bardzo dużą zaletą książki, bo początkowi programiści mają największy problem ze znalezieniem miejsca na wzorzec w swoich projektach. Po lekturze tej książki na pewno będzie to łatwiejsze.<br />
Pamiętając, że wzorców jest razem 23 &#8211; 14tu z nim zostały poświęcone całe, dość spore rozdziały. Pozostałe 9 zostało opisane dość skrótowo, co nie znaczy, że nie zrozumiale. Uważam jednak, że wzorzec Proxy ze względu na swoją specyfikę i dość rzadkie zastosowanie powinien być potraktowany opisowo, natomiast rozdział ten powinien zostać poświęcony na wzorzec Builder albo Chains of responsibility. Być może jednak jest to tylko moje odczucie.<br />
Zdecydowanie polecam tą książkę zarówno tym, którzy nie potrafią wzorców jak i tym, którym się zdaje że je potrafią. Książka potrafi ukazać problem z całkowicie innej perspektywy. Bardzo łatwo z nią nauczyć się lub utrwalić wiedzę na temat wzorców.<br />
<img src="http://marioosh.5dots.pl/wp-content/uploads/hfdepa-255x300.jpg" alt="hfdepa" title="hfdepa" width="255" height="300" class="aligncenter size-medium wp-image-554" /></p>
<p>Jeżeli nauka wzorców ma być tylko jednym z kroków do nauki poprawnego programowania obiektowego to z tego miejsca polecam drugą książkę z tej serii: <a href="http://helion.pl/ksiazki/head_first_object_oriented_analysis_and_design_edycja_polska_rusz_glowa_brett_d_mclaughlin_gary_pollice_david_west,hfooad.htm">Head First Object-Oriented Analysis and Design</a>. Obie pozycje w duecie dostarczają bardzo duży zasób wiedzy z programowania obiektowego. </p>
<p>Obie pozycje zdecydowanie polecam, </p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2010%2F08%2Fwzorce-projektowe-zrodlo-ksiazkowe%2F&amp;linkname=Wzorce%20Projektowe%2C%20%C5%BAr%C3%B3d%C5%82o%20ksi%C4%85%C5%BCkowe" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/" title="Wzorce projektowe: Interpreter">Wzorce projektowe: Interpreter</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/" title="Wzorce projektowe: Memento">Wzorce projektowe: Memento</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2010/08/wzorce-projektowe-zrodlo-ksiazkowe/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Wzorce projektowe: Visitor</title>
		<link>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/</link>
		<comments>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 23:24:09 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=245</guid>
		<description><![CDATA[W aplikacjach często wykorzystuje się kolekcje takie jak List, Set, Map czy pochodne. W kolekcjach tych przetrzymuje się obiekty różnego typu. Nie jednokrotnie także buduje się kolekcje o budowie hierarchicznej, np. za pomocą wzorca Composite. Są sytuajcje, gdy musimy przeiterować się po takiej kolekcji w jakimś celu i wykonać na każdym obiekcie jakąś metodę. Np. [...]]]></description>
			<content:encoded><![CDATA[<p>W aplikacjach często wykorzystuje się kolekcje takie jak List, Set, Map czy pochodne. W kolekcjach tych przetrzymuje się obiekty różnego typu. Nie jednokrotnie także buduje się kolekcje o budowie hierarchicznej, np. za pomocą wzorca Composite. Są sytuajcje, gdy musimy przeiterować się po takiej kolekcji w jakimś celu i wykonać na każdym obiekcie jakąś metodę. Np. w sytuacji przeindeksowania, lub przywrócenia utraconych danych. Problem w tym, że kolekcja jak wspomniano może zawierać kilka różnych obiektów i każdy powinien być traktowany inaczej. Korzystanie w takiej sytuacji z <span style="font-style: italic;">instanceof</span> nie jest do końca zgodne z myślą projektowania obiektowego. Zatem co? Zatem wzorzec Viisitor.<br />
Visitor jest wzorcem operacyjnym, który potrafi wykonać daną operację na całej strukturze obiektów. Visitor pozwala na zdefiniowanie nowych operacji na elementach struktury, bez zmiany klas tych elementów.<br />
We wzorcu mamy aktorów:<br />
Visitor: interfejs który definiuje metody dla wszystkich odwiedzanych obiektów. metody powinny być przeciążane aby miały taką samę nazwę. Wybór metody zależny jest od obiektu który jest podany jako parametr.<br />
ConcreteVisitor &#8211; implementacja interfejsu Visitor. Każdy ConcreteVisitor jest budowany dla różnego rodzaju operacji, możemy w systemie zbudować kilka Visitorów i każdy będzie do innego celu.<br />
Visitable &#8211; abstakcja &#8211; interfejs który jest implementowany przez obiekty, które mają być wizytowane. każdy obiekt kolekcji powinien implementować ten interfejs.<br />
ConcreteVisitable &#8211; Klasy implementujące interfejs Visitable definiujące metodę <span style="font-style: italic;">accept</span>(). Visitor poprzez tą metode dostaje się do wnętrza obiektu wizytowanego.<br />
ObjectStruture &#8211; Klasa zawierająca wszystki obiekty, które moga być odwiedzone. Klasa udostępnia iterator, który pozwala na przemieszczanie sie między kolejnymi składnikami kolekcji. ObjectStructure może być klasą lub całą strukturą klas jak np. Composite.</p>
<p>Sprawdźmy:</p>
<p>Posiadamy sklep internetowy: Część struktury składa się z następujących elementów:<br />
GrupaKlientów, Klient, Zamówienie i Przedmiot. Każde zamówienie posiada co najmniej jedne przedmiot. Każdy klient posiada conajmniej jedno zamówienie.<br />
Chcemy wygenerować raporty dotyczące grup użytkowników naszego sklepu.</p>
<p>Tworzym dwa interfejsy : Visitor i Visitable.<br />
Musimy utworzyć klasę zbierającą dane (ZbieraczDanych), która będzie Visitorem.<br />
Klasy GrupaKlientów, Klient, Zamówienie i Przedmiot muszą implementować interfejs Visitable.<br />
Klasa kliencka która zarządza całością.</p>
<p>Sprawdźmy jak to wygląda:</p>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">interface</span><span style="background-color: #ffffff;"> Visitor {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> visit(Klient klient);
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> visit(Zamówienie zamówienie);
</span><span style="color: #800000;"> 5
 6 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> visit(Przedmiot przedmiot);
</span><span style="color: #800000;"> 7 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;"> 8 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;">1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">interface</span><span style="background-color: #ffffff;"> Visitable {
</span><span style="color: #800000;">2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> accept(Visitor visitor);
</span><span style="color: #800000;">3 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">4 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> GrupaKlientów </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color: #ffffff;"> Visitable {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> List&lt;Klient&gt; </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">klienci </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> ArrayList&lt;Klient&gt;();
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> accept(Visitor visitor) {
</span><span style="color: #800000;"> 5 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">for</span><span style="background-color: #ffffff;"> (Iterator it = </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">klienci.</span><span style="background-color: #ffffff;">iterator(); it.hasNext();) {
</span><span style="color: #800000;"> 6 </span><span style="background-color: #ffffff;">            ((Klient) it.next()).accept(visitor);
</span><span style="color: #800000;"> 7 </span><span style="background-color: #ffffff;">        }
</span><span style="color: #800000;"> 8 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 9
10 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> addKlient(Klient klient) {
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">klienci.</span><span style="background-color: #ffffff;">add(klient);
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">13 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">14 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Klient </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color: #ffffff;"> Visitable {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> String </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name;
</span><span style="color: #800000;"> 3 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> List&lt;Zamówienie&gt; </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">zamówienia </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> ArrayList&lt;Zamówienie&gt;();
</span><span style="color: #800000;"> 4
 5
 6 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Klient(String name) {
</span><span style="color: #800000;"> 7 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name </span><span style="background-color: #ffffff;">= name;
</span><span style="color: #800000;"> 8 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 9
10 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> dodajZamówienie(Zamówienie zamówienie) {
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">zamówienia.</span><span style="background-color: #ffffff;">add(zamówienie);
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">13
14 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> accept(Visitor visitor) {
</span><span style="color: #800000;">15 </span><span style="background-color: #ffffff;">        visitor.visit(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">16 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">for</span><span style="background-color: #ffffff;"> (Iterator it = </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">zamówienia.</span><span style="background-color: #ffffff;">iterator(); it.hasNext();) {
</span><span style="color: #800000;">17 </span><span style="background-color: #ffffff;">            ((Zamówienie) it.next()).accept(visitor);
</span><span style="color: #800000;">18 </span><span style="background-color: #ffffff;">        }
</span><span style="color: #800000;">19
20 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">21
22 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> setName(String name) {
</span><span style="color: #800000;">23 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name </span><span style="background-color: #ffffff;">= name;
</span><span style="color: #800000;">24 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">25
26 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> String getName() {
</span><span style="color: #800000;">27 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name;
</span><span style="color: #800000;">28
29 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">30 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">31 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Zamówienie </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color: #ffffff;"> Visitable {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> String </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name;
</span><span style="color: #800000;"> 3 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> List&lt;Przedmiot&gt; </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">przedmioty </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> ArrayList&lt;Przedmiot&gt;();
</span><span style="color: #800000;"> 4
 5 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Zamówienie(String name) {
</span><span style="color: #800000;"> 6 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name </span><span style="background-color: #ffffff;">= name;
</span><span style="color: #800000;"> 7 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 8
 9 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Zamówienie(String name, String przedmiot) {
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name </span><span style="background-color: #ffffff;">= name;
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.dodajPrzedmiot(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Przedmiot(przedmiot));
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">13
14 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> setName(String name) {
</span><span style="color: #800000;">15 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name </span><span style="background-color: #ffffff;">= name;
</span><span style="color: #800000;">16 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">17
18 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> accept(Visitor visitor) {
</span><span style="color: #800000;">19
20 </span><span style="background-color: #ffffff;">        visitor.visit(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">21 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">for</span><span style="background-color: #ffffff;"> (Iterator it = </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">przedmioty.</span><span style="background-color: #ffffff;">iterator(); it.hasNext();) {
</span><span style="color: #800000;">22 </span><span style="background-color: #ffffff;">            ((Przedmiot) it.next()).accept(visitor);
</span><span style="color: #800000;">23 </span><span style="background-color: #ffffff;">        }
</span><span style="color: #800000;">24 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">25
26 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> String getName() {
</span><span style="color: #800000;">27 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name;
</span><span style="color: #800000;">28 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">29
30 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> dodajPrzedmiot(Przedmiot przedmiot) {
</span><span style="color: #800000;">31 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">przedmioty.</span><span style="background-color: #ffffff;">add(przedmiot);
</span><span style="color: #800000;">32 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">33 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">34 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Przedmiot </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color: #ffffff;"> Visitable {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> String </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Przedmiot(String name) {
</span><span style="color: #800000;"> 5 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name </span><span style="background-color: #ffffff;">= name;
</span><span style="color: #800000;"> 6 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 7
 8
 9 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> accept(Visitor visitor) {
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">        visitor.visit(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">12
13 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> String getName() {
</span><span style="color: #800000;">14 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name;
</span><span style="color: #800000;">15 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">16
17 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> setName(String name) {
</span><span style="color: #800000;">18 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">name </span><span style="background-color: #ffffff;">= name;
</span><span style="color: #800000;">19 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">20 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">21 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> ZbieraczDanych </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color: #ffffff;"> Visitor {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">liczbaKlientów;
</span><span style="color: #800000;"> 3 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">liczbaZamówień;
</span><span style="color: #800000;"> 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">liczbaPrzedmiotów;
</span><span style="color: #800000;"> 5
 6
 7 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> visit(Klient klient) {
</span><span style="color: #800000;"> 8 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(klient.getName());
</span><span style="color: #800000;"> 9 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">liczbaKlientów++</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">11
12 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> visit(Zamówienie zamówienie) {
</span><span style="color: #800000;">13 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(zamówienie.getName());
</span><span style="color: #800000;">14 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">liczbaZamówień++</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">15 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">16
17 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> visit(Przedmiot przedmiot) {
</span><span style="color: #800000;">18 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(przedmiot.getName());
</span><span style="color: #800000;">19 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">liczbaPrzedmiotów++</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">20
21 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">22
23 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> pokażWyniki() {
</span><span style="color: #800000;">24 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Liczba klientów:"</span><span style="background-color: #ffffff;"> + </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">liczbaKlientów)</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">25 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Liczba zamówień:"</span><span style="background-color: #ffffff;"> + </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">liczbaZamówień)</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">26 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Liczba przedmiotów: "</span><span style="background-color: #ffffff;"> + </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">liczbaPrzedmiotów)</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">27 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">28 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">29 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> VisitorTester {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> main(String[] args) {
</span><span style="color: #800000;"> 3 </span><span style="background-color: #ffffff;">        Klient klient1 = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Klient(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Klient 1"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;"> 4
 5 </span><span style="background-color: #ffffff;">        klient1.dodajZamówienie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Zamówienie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"zamówienie_1"</span><span style="background-color: #ffffff;">, </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"przedmiot_1"</span><span style="background-color: #ffffff;">));
</span><span style="color: #800000;"> 6 </span><span style="background-color: #ffffff;">        klient1.dodajZamówienie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Zamówienie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"zamówienie_2"</span><span style="background-color: #ffffff;">, </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"przedmiot_1"</span><span style="background-color: #ffffff;">));
</span><span style="color: #800000;"> 7 </span><span style="background-color: #ffffff;">        klient1.dodajZamówienie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Zamówienie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"zamówienie_3"</span><span style="background-color: #ffffff;">, </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"przedmiot_1"</span><span style="background-color: #ffffff;">));
</span><span style="color: #800000;"> 8
 9 </span><span style="background-color: #ffffff;">        Klient klient2 = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Klient(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Klient 2"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">        Zamówienie zamówienie = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Zamówienie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"zamówienie_a"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">        zamówienie.dodajPrzedmiot(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Przedmiot(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"przedmiot_a1"</span><span style="background-color: #ffffff;">));
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">        zamówienie.dodajPrzedmiot(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Przedmiot(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"przedmiot_a2"</span><span style="background-color: #ffffff;">));
</span><span style="color: #800000;">13 </span><span style="background-color: #ffffff;">        zamówienie.dodajPrzedmiot(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Przedmiot(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"przedmiot_a3"</span><span style="background-color: #ffffff;">));
</span><span style="color: #800000;">14 </span><span style="background-color: #ffffff;">        klient2.dodajZamówienie(zamówienie);
</span><span style="color: #800000;">15 </span><span style="background-color: #ffffff;">        klient2.dodajZamówienie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Zamówienie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"zamówienie_b"</span><span style="background-color: #ffffff;">, </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"przedmiot_b1"</span><span style="background-color: #ffffff;">));
</span><span style="color: #800000;">16
17 </span><span style="background-color: #ffffff;">        GrupaKlientów grupaKlientów = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> GrupaKlientów();
</span><span style="color: #800000;">18 </span><span style="background-color: #ffffff;">        grupaKlientów.addKlient(klient1);
</span><span style="color: #800000;">19 </span><span style="background-color: #ffffff;">        grupaKlientów.addKlient(klient2);
</span><span style="color: #800000;">20 </span><span style="background-color: #ffffff;">        ZbieraczDanych zbieraczDanych = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> ZbieraczDanych();
</span><span style="color: #800000;">21
22 </span><span style="background-color: #ffffff;">        grupaKlientów.accept(zbieraczDanych);
</span><span style="color: #800000;">23
24 </span><span style="background-color: #ffffff;">        zbieraczDanych.pokażWyniki();
</span><span style="color: #800000;">25
26 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">27 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">28 </span></pre>
<p>Diagram wzorca:</p>
<p><a href="http://marioosh.5dots.pl/wp-content/uploads/visitor.png"><img class="aligncenter size-medium wp-image-246" title="visitor" src="http://marioosh.5dots.pl/wp-content/uploads/visitor-244x300.png" alt="" width="244" height="300" /></a></p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-visitor%2F&amp;linkname=Wzorce%20projektowe%3A%20Visitor" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/" title="Wzorce projektowe: Interpreter">Wzorce projektowe: Interpreter</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/" title="Wzorce projektowe: Memento">Wzorce projektowe: Memento</a></li><li>10.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-mediator/" title="Wzorce projektowe: Mediator">Wzorce projektowe: Mediator</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wzorce projektowe: Interpreter</title>
		<link>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/</link>
		<comments>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 21:02:29 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=241</guid>
		<description><![CDATA[Interpreter jest wzorcem projektowym, którego zadaniem jest interpretacja poleceń innego języka. Dany język rokładany jest na części gramatyczne i potem na zorientowaną obiektowo hierarchię. Interpreter nie jest właściwie niczym innym jak wzorcem Kompozyt, tylko że ma trochę inną rolę &#8211; reprezentuje reguły gramatyczne. W niektórych przypadkach wzorzec Interpreter może zwiększyć funkcjonalność wzorca Kompozyt. Częstym przypadkiem [...]]]></description>
			<content:encoded><![CDATA[<p>Interpreter jest wzorcem projektowym, którego zadaniem jest interpretacja poleceń innego języka. Dany język rokładany jest na części gramatyczne i potem na zorientowaną obiektowo hierarchię. Interpreter nie jest właściwie niczym innym jak wzorcem Kompozyt, tylko że ma trochę inną rolę &#8211; reprezentuje reguły gramatyczne. W niektórych przypadkach wzorzec Interpreter może zwiększyć funkcjonalność wzorca Kompozyt. Częstym przypadkiem używania wzorca jest interpretacja zasad.</p>
<p>Interpreter składa się :<br />
Context: który przetrzymuje dane, które powinny poddać się interpretacji,<br />
Abstract Expression: klasa abstrakcyjna która interpretuje polecenia,<br />
&#8230;. Expression &#8211; konkretne klasy, które interpretują treść Contextu dla poszczególnych przypadków.<br />
Abstract Expression i konkretne implementacje tworza wzorzec Template Method.</p>
<p>Main (albo inaczej Client)</p>
<p>Program do interpretacji liczby rzymskiej (znaleziony gdzieś na notatkach, ale nie mojego autorstwa):</p>
<p>Context: przechowuje treść tekstu do interpretacji:</p>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> Context {
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> String </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">input;
</span><span style="color: #800000;"> 4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">output;
</span><span style="color: #800000;"> 5
 6 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> Context(String input) {
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">input </span><span style="background-color:#ffffff;">= input;
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;"> 9
10 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String getInput() {
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">input;
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">13
14 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> setInput(String input) {
</span><span style="color: #800000;">15 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">input </span><span style="background-color:#ffffff;">= input;
</span><span style="color: #800000;">16 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">17
18 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> getOutput() {
</span><span style="color: #800000;">19 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">output;
</span><span style="color: #800000;">20 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">21
22 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> setOutput(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> output) {
</span><span style="color: #800000;">23 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">output </span><span style="background-color:#ffffff;">= output;
</span><span style="color: #800000;">24 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">25
26 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">27 </span></pre>
<p>Expression: interpretuje fragment cyfry rzymksiej jako decymalny odpowiednik, expression jest implemntowany przez cztery podklasy: Thousand&#8230;, Hundred&#8230;, Ten&#8230;, i OneExpression które interpretują poszczególne części cyfry.</p>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">abstract</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> Expression {
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> interpret(Context context) {
</span><span style="color: #800000;"> 4 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (context.getInput().length() == </span><span style="background-color: #ffffff; color: #0000ff;">0</span><span style="background-color:#ffffff;">)
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">            </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;">;
</span><span style="color: #800000;"> 6
 7 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (context.getInput().startsWith(nine())) {
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">            context.setOutput(context.getOutput() + (</span><span style="background-color: #ffffff; color: #0000ff;">9</span><span style="background-color:#ffffff;"> * multiplier()));
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">            context.setInput(context.getInput().substring(</span><span style="background-color: #ffffff; color: #0000ff;">2</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">10 </span><span style="background-color:#ffffff;">        } </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">else</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (context.getInput().startsWith(four())) {
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">            context.setOutput(context.getOutput() + (</span><span style="background-color: #ffffff; color: #0000ff;">4</span><span style="background-color:#ffffff;"> * multiplier()));
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">            context.setInput(context.getInput().substring(</span><span style="background-color: #ffffff; color: #0000ff;">2</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">13 </span><span style="background-color:#ffffff;">        } </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">else</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (context.getInput().startsWith(five())) {
</span><span style="color: #800000;">14 </span><span style="background-color:#ffffff;">            context.setOutput(context.getOutput() + (</span><span style="background-color: #ffffff; color: #0000ff;">5</span><span style="background-color:#ffffff;"> * multiplier()));
</span><span style="color: #800000;">15 </span><span style="background-color:#ffffff;">            context.setInput(context.getInput().substring(</span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">16 </span><span style="background-color:#ffffff;">        }
</span><span style="color: #800000;">17
18 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">while</span><span style="background-color:#ffffff;"> (context.getInput().startsWith(one())) {
</span><span style="color: #800000;">19 </span><span style="background-color:#ffffff;">            context.setOutput(context.getOutput() + (</span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;"> * multiplier()));
</span><span style="color: #800000;">20 </span><span style="background-color:#ffffff;">            context.setInput(context.getInput().substring(</span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">21 </span><span style="background-color:#ffffff;">        }
</span><span style="color: #800000;">22 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">23
24 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">abstract</span><span style="background-color:#ffffff;"> String one();
</span><span style="color: #800000;">25
26 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">abstract</span><span style="background-color:#ffffff;"> String four();
</span><span style="color: #800000;">27
28 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">abstract</span><span style="background-color:#ffffff;"> String five();
</span><span style="color: #800000;">29
30 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">abstract</span><span style="background-color:#ffffff;"> String nine();
</span><span style="color: #800000;">31
32 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">abstract</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> multiplier();
</span><span style="color: #800000;">33
34 </span><span style="background-color:#ffffff;">}</span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> ThousandExpression  </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">extends</span><span style="background-color:#ffffff;"> Expression{
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String one() { </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"M"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;"> 4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String four(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">" "</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String five(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">" "</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String nine(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">" "</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> multiplier() { </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; color: #0000ff;">1000</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">}</span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;">1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> HundredExpression </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">extends</span><span style="background-color:#ffffff;"> Expression{
</span><span style="color: #800000;">2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;">  String one() { </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"C"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;">  String four(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"CD"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;">  String five(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"D"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">5 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;">  String nine(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"CM"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">6 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;">  </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> multiplier() { </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; color: #0000ff;">100</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">7 </span><span style="background-color:#ffffff;">}</span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;">1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> TenExpression  </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">extends</span><span style="background-color:#ffffff;"> Expression{
</span><span style="color: #800000;">2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String one() { </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"X"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String four(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"XL"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String five(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"L"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">5 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String nine(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"XC"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">6 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> multiplier() { </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; color: #0000ff;">10</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">7 </span><span style="background-color:#ffffff;">}</span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;">1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> OneExpression  </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">extends</span><span style="background-color:#ffffff;"> Expression{
</span><span style="color: #800000;">2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String one() { </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"I"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String four(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"IV"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String five(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"V"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">5 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> String nine(){ </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"IX"</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">6 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> multiplier() { </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;">; }
</span><span style="color: #800000;">7 </span><span style="background-color:#ffffff;">}</span></pre>
<p>Main:  wykonawca interpretacji:</p>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> MainInterpreter {
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color:#ffffff;">	</span><span style="background-color: #ffffff; font-style: italic; color: #808080;">/**
</span><span style="color: #800000;"> 4 </span><span style="background-color: #ffffff; font-style: italic; color: #808080;">	 * </span><span style="color: #808080; text-decoration: underline;"><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #808080;">@param</span></span><span style="background-color: #ffffff; font-style: italic; color: #808080;"> args
</span><span style="color: #800000;"> 5 </span><span style="background-color: #ffffff; font-style: italic; color: #808080;">	 */
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">	</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> main(String[] args) {
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">	      String roman = </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"MCMXXVIII"</span><span style="background-color:#ffffff;">;
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">	      Context context = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Context(roman);
</span><span style="color: #800000;">10
11 </span><span style="background-color:#ffffff;">	      </span><span style="background-color: #ffffff; font-style: italic; color: #808080;">// Build the 'parse tree'
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">	      ArrayList&lt;Expression&gt; tree = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> ArrayList&lt;Expression&gt;();
</span><span style="color: #800000;">13 </span><span style="background-color:#ffffff;">	      tree.add(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> ThousandExpression());
</span><span style="color: #800000;">14 </span><span style="background-color:#ffffff;">	      tree.add(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> HundredExpression());
</span><span style="color: #800000;">15 </span><span style="background-color:#ffffff;">	      tree.add(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> TenExpression());
</span><span style="color: #800000;">16 </span><span style="background-color:#ffffff;">	      tree.add(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> OneExpression());
</span><span style="color: #800000;">17
18 </span><span style="background-color:#ffffff;">	      </span><span style="background-color: #ffffff; font-style: italic; color: #808080;">// Interpret
</span><span style="color: #800000;">19 </span><span style="background-color:#ffffff;">	      </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">for</span><span style="background-color:#ffffff;"> (Iterator it = tree.iterator(); it.hasNext();)
</span><span style="color: #800000;">20 </span><span style="background-color:#ffffff;">	      {
</span><span style="color: #800000;">21 </span><span style="background-color:#ffffff;">	    	  Expression exp = (Expression)it.next();
</span><span style="color: #800000;">22 </span><span style="background-color:#ffffff;">	    	  exp.interpret(context);
</span><span style="color: #800000;">23 </span><span style="background-color:#ffffff;">	      }
</span><span style="color: #800000;">24
25 </span><span style="background-color:#ffffff;">	      System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(roman + </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">" = "</span><span style="background-color:#ffffff;"> + Integer.</span><span style="background-color:#ffffff;font-style:italic;">toString(</span><span style="background-color:#ffffff;">context.getOutput()));
</span><span style="color: #800000;">26 </span><span style="background-color:#ffffff;">	}
</span><span style="color: #800000;">27 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">28 </span></pre>
<p>Diagram wzorca:</p>
<p><a href="http://marioosh.5dots.pl/wp-content/uploads/interpreter.png"><img class="aligncenter size-medium wp-image-242" title="interpreter" src="http://marioosh.5dots.pl/wp-content/uploads/interpreter-300x271.png" alt="" width="300" height="271" /></a></p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-interpreter%2F&amp;linkname=Wzorce%20projektowe%3A%20Interpreter" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/" title="Wzorce projektowe: Memento">Wzorce projektowe: Memento</a></li><li>10.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-mediator/" title="Wzorce projektowe: Mediator">Wzorce projektowe: Mediator</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wzorce projektowe: Memento</title>
		<link>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/</link>
		<comments>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 20:59:44 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=238</guid>
		<description><![CDATA[Memento jest wzorcem, którego wykorzystuje w sytuacji gdy musimy zamrozić stan obiektu w celu jego późniejszego wykonania. Na przykład tak działa Undo. Drugim częstym sposobem na wykorzystanie wzorca memento jest zapamiętywanie wyników zapytań bazy danych w celu ich ponownego późniejszego wykoniania. Zwłaszcza gdy wykonanie zapytań jest bardzo zasobożerne.
Wzorzec memento składa się z trzech głównych obiektów:
Originator: [...]]]></description>
			<content:encoded><![CDATA[<p>Memento jest wzorcem, którego wykorzystuje w sytuacji gdy musimy zamrozić stan obiektu w celu jego późniejszego wykonania. Na przykład tak działa Undo. Drugim częstym sposobem na wykorzystanie wzorca memento jest zapamiętywanie wyników zapytań bazy danych w celu ich ponownego późniejszego wykoniania. Zwłaszcza gdy wykonanie zapytań jest bardzo zasobożerne.</p>
<p>Wzorzec memento składa się z trzech głównych obiektów:<br />
Originator: klasa, której stan ma być przechowywany, musimy w niej implementować metody zapisujące i odczytujące stan z obiektu Memento<br />
Memento: klasa, w która potrafi przechować wszystkie dane z Originatora, które muszą być utrwalone.<br />
Caretaker: jest klasą która przechowuje kolekcję memento i udostępnia metody do zapisu i odczytu.</p>
<p>Przypuśmy że mamy klasę (Originator), która ma pole <span style="font-style: italic;">State</span> pole to musi być utrwalane. Tworzymy zatem drugą klasę (Memento) która również posiada pole <span style="font-style: italic;">State</span>. W momencie gdy potrzebujemy utrwalenia wywołujemy metodę saveToMemento Originatora. Metoda ta tworzy obiekt Memento z obecną wartością pola state Originatora. następnie nowo utworzone Memento jest wysyłane do Caretakera w celu utrwalenia.</p>
<p>Zobaczmy:</p>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Memento {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> String </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">state;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> String getSavedState() {
</span><span style="color: #800000;"> 5 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">state;
</span><span style="color: #800000;"> 6 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 7
 8 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Memento(String stateToSave) {
</span><span style="color: #800000;"> 9 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">state </span><span style="background-color: #ffffff;">= stateToSave;
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">12 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Originator {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> String </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">state;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> setState(String state) {
</span><span style="color: #800000;"> 5 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Originator: Setting state to: "</span><span style="background-color: #ffffff;"> + state);
</span><span style="color: #800000;"> 6 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">state </span><span style="background-color: #ffffff;">= state;
</span><span style="color: #800000;"> 7 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 8
 9 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Memento saveToMemento() {
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Originator: Saving to Memento"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Memento(</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">state)</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">13
14 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> restoreFromMemento(Memento m) {
</span><span style="color: #800000;">15 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">state </span><span style="background-color: #ffffff;">= m.getSavedState();
</span><span style="color: #800000;">16 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Originator: State restored from Memento: "</span><span style="background-color: #ffffff;"> + </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">state)</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">17 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">18 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">19 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Caretaker {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> List&lt;Memento&gt; </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">savedStates </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> ArrayList&lt;Memento&gt;();
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> addMemento(Memento m) {
</span><span style="color: #800000;"> 5 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">savedStates.</span><span style="background-color: #ffffff;">add(m);
</span><span style="color: #800000;"> 6 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 7
 8 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Memento getMemento(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> index) {
</span><span style="color: #800000;"> 9 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">savedStates.</span><span style="background-color: #ffffff;">get(index);
</span><span style="color: #800000;">10
11 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">13 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> MementoRunner {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> main(String[] args) {
</span><span style="color: #800000;"> 3 </span><span style="background-color: #ffffff;">        Caretaker caretaker = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Caretaker();
</span><span style="color: #800000;"> 4
 5 </span><span style="background-color: #ffffff;">        Originator originator = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Originator();
</span><span style="color: #800000;"> 6
 7 </span><span style="background-color: #ffffff;">        originator.setState(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"State 1"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;"> 8
 9 </span><span style="background-color: #ffffff;">        originator.setState(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"State 2"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">        caretaker.addMemento(originator.saveToMemento());
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">        originator.setState(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"State 3"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">        caretaker.addMemento(originator.saveToMemento());
</span><span style="color: #800000;">13 </span><span style="background-color: #ffffff;">        originator.setState(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"State 4"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">14 </span><span style="background-color: #ffffff;">        originator.restoreFromMemento(caretaker.getMemento(</span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color: #ffffff;">));
</span><span style="color: #800000;">15 </span><span style="background-color: #ffffff;">
</span><span style="color: #800000;">16
17 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">18 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">19 </span></pre>
<p>Diagram wzorca:</p>
<p><a href="http://marioosh.5dots.pl/wp-content/uploads/memento.png"><img class="aligncenter size-medium wp-image-239" title="memento" src="http://marioosh.5dots.pl/wp-content/uploads/memento-300x190.png" alt="" width="300" height="190" /></a></p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-memento%2F&amp;linkname=Wzorce%20projektowe%3A%20Memento" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/" title="Wzorce projektowe: Interpreter">Wzorce projektowe: Interpreter</a></li><li>10.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-mediator/" title="Wzorce projektowe: Mediator">Wzorce projektowe: Mediator</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wzorce projektowe: Mediator</title>
		<link>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-mediator/</link>
		<comments>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-mediator/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 21:41:29 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=235</guid>
		<description><![CDATA[Wzorzec operacyjny Mediator jest wykorzystywany do skupiania złożonych procedur komunikacji i sterowania w środowisku powiązanych obiektów. Obiekty w systemie zamiast komunikować się między sobą bezpośrednio robią to poprzez klasę Mediatora &#8211; nie muszą wtedy wiedzieć o swoim własnym istnieniu bezpośrednio. Wysyłają informację do mediatora, a on przekaże go do obiektu, który ma być celem żądania. [...]]]></description>
			<content:encoded><![CDATA[<p>Wzorzec operacyjny Mediator jest wykorzystywany do skupiania złożonych procedur komunikacji i sterowania w środowisku powiązanych obiektów. Obiekty w systemie zamiast komunikować się między sobą bezpośrednio robią to poprzez klasę Mediatora &#8211; nie muszą wtedy wiedzieć o swoim własnym istnieniu bezpośrednio. Wysyłają informację do mediatora, a on przekaże go do obiektu, który ma być celem żądania. Pozwala to na łatwą przyszłą modyfikację aplikacji, ponieważ wszystkie wpólne relacje są w jednym miejscu.</p>
<p>Sprawdźmy działanie programu, który oddziela obiekt wysyłający informacje, od obiektu który jest odbiorcą tych wiadomości.</p>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Mediator {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">boolean</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">slotFull </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">false</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">number;
</span><span style="color: #800000;"> 5
 6 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">synchronized</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> storeMessage(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> num) {
</span><span style="color: #800000;"> 7 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">while</span><span style="background-color: #ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">slotFull </span><span style="background-color: #ffffff;">== </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">true</span><span style="background-color: #ffffff;">) {
</span><span style="color: #800000;"> 8 </span><span style="background-color: #ffffff;">            </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">try</span><span style="background-color: #ffffff;"> {
</span><span style="color: #800000;"> 9 </span><span style="background-color: #ffffff;">                wait();
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">            } </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">catch</span><span style="background-color: #ffffff;"> (InterruptedException e) {
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">                e.printStackTrace();
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">            }
</span><span style="color: #800000;">13 </span><span style="background-color: #ffffff;">        }
</span><span style="color: #800000;">14
15 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">slotFull </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">true</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">16 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">number </span><span style="background-color: #ffffff;">= num;
</span><span style="color: #800000;">17 </span><span style="background-color: #ffffff;">        notifyAll();
</span><span style="color: #800000;">18
19 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">20
21 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">synchronized</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> retrieveMessage() {
</span><span style="color: #800000;">22
23 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">while</span><span style="background-color: #ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">slotFull </span><span style="background-color: #ffffff;">== </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">false</span><span style="background-color: #ffffff;">)         </span><span style="background-color: #ffffff; font-style: italic; color: #808080;">
</span><span style="color: #800000;">24
25 </span><span style="background-color: #ffffff;">            </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">try</span><span style="background-color: #ffffff;"> {
</span><span style="color: #800000;">26 </span><span style="background-color: #ffffff;">                wait();
</span><span style="color: #800000;">27 </span><span style="background-color: #ffffff;">            } </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">catch</span><span style="background-color: #ffffff;"> (InterruptedException e) {
</span><span style="color: #800000;">28 </span><span style="background-color: #ffffff;">            }
</span><span style="color: #800000;">29
30 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">slotFull </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">false</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">31
32 </span><span style="background-color: #ffffff;">        notifyAll();
</span><span style="color: #800000;">33
34 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">number;
</span><span style="color: #800000;">35
36 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">37 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">38 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Producer </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">extends</span><span style="background-color: #ffffff;"> Thread {
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> Mediator </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">med;
</span><span style="color: #800000;"> 4
 5 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">id;</span><span style="background-color: #ffffff;">
</span><span style="color: #800000;"> 6
 7 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">num </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;"> 8
 9 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Producer(Mediator m) {
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">med </span><span style="background-color: #ffffff;">= m;
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">id </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">num++</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">13
14 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> run() {
</span><span style="color: #800000;">15
16 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> num;
</span><span style="color: #800000;">17
18 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">while</span><span style="background-color: #ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">true</span><span style="background-color: #ffffff;">) {
</span><span style="color: #800000;">19
20 </span><span style="background-color: #ffffff;">            </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">med.</span><span style="background-color: #ffffff;">storeMessage(num = (</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;">) (Math.</span><span style="background-color: #ffffff; font-style: italic;">random(</span><span style="background-color: #ffffff;">) * </span><span style="background-color: #ffffff; color: #0000ff;">100</span><span style="background-color: #ffffff;">));
</span><span style="color: #800000;">21
22 </span><span style="background-color: #ffffff;">            System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"p"</span><span style="background-color: #ffffff;"> + </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">id </span><span style="background-color: #ffffff;">+ </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"-"</span><span style="background-color: #ffffff;"> + num + </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"   "</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">23
24 </span><span style="background-color: #ffffff;">        }
</span><span style="color: #800000;">25 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">26 </span><span style="background-color: #ffffff;">}</span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Consumer </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">extends</span><span style="background-color: #ffffff;"> Thread {
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> Mediator </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">med;</span><span style="background-color: #ffffff;">                </span><span style="background-color: #ffffff; font-style: italic; color: #808080;">
</span><span style="color: #800000;"> 4
 5 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">id;</span><span style="background-color: #ffffff;">                 </span><span style="background-color: #ffffff; font-style: italic; color: #808080;">
</span><span style="color: #800000;"> 6
 7 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">num </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;"> 8
 9 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Consumer(Mediator m) {
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">med </span><span style="background-color: #ffffff;">= m;
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">id </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">num++</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;">12 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">13
14 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> run() {
</span><span style="color: #800000;">15
16 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">while</span><span style="background-color: #ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">true</span><span style="background-color: #ffffff;">) {
</span><span style="color: #800000;">17
18 </span><span style="background-color: #ffffff;">            System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"c"</span><span style="background-color: #ffffff;"> + </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">id </span><span style="background-color: #ffffff;">+ </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"-"</span><span style="background-color: #ffffff;"> + </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">med.</span><span style="background-color: #ffffff;">retrieveMessage() + </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"   "</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">19
20 </span><span style="background-color: #ffffff;">        }
</span><span style="color: #800000;">21 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">22 </span><span style="background-color: #ffffff;">}</span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 100%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> MediatorDemo {
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> main(String[] args) {
</span><span style="color: #800000;"> 4
 5 </span><span style="background-color: #ffffff;">        Mediator mb = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Mediator();
</span><span style="color: #800000;"> 6
 7 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Producer(mb).start();
</span><span style="color: #800000;"> 8
 9 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Producer(mb).start();
</span><span style="color: #800000;">10
11 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Consumer(mb).start();
</span><span style="color: #800000;">12
13 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Consumer(mb).start();
</span><span style="color: #800000;">14
15 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Consumer(mb).start();
</span><span style="color: #800000;">16
17 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Consumer(mb).start();
</span><span style="color: #800000;">18
19 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">20 </span><span style="background-color: #ffffff;">}</span></pre>
<p>Diagram wzorca:</p>
<p><a href="http://marioosh.5dots.pl/wp-content/uploads/mediator.png"><img class="aligncenter size-medium wp-image-236" title="mediator" src="http://marioosh.5dots.pl/wp-content/uploads/mediator-277x300.png" alt="" width="277" height="300" /></a></p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-mediator%2F&amp;linkname=Wzorce%20projektowe%3A%20Mediator" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/" title="Wzorce projektowe: Interpreter">Wzorce projektowe: Interpreter</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/" title="Wzorce projektowe: Memento">Wzorce projektowe: Memento</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-mediator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wzorce projektowe: Chain of Responsibility</title>
		<link>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-chain-of-responsibility/</link>
		<comments>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-chain-of-responsibility/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 22:03:12 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=230</guid>
		<description><![CDATA[Wzorzec projektowy Chains of Responsibility prowadzi do utworzenia łańcucha obiektów, które analizują żadanie. Analiza przeprowadzana jest kolejno przez każdy z nich. Obiekt może zapewnić obsługę żądania lub przekazuje to żądanie dalej, lub to i to.
 1 public class Żądanie {
 2     private String title;
 3     private int [...]]]></description>
			<content:encoded><![CDATA[<p>Wzorzec projektowy Chains of Responsibility prowadzi do utworzenia łańcucha obiektów, które analizują żadanie. Analiza przeprowadzana jest kolejno przez każdy z nich. Obiekt może zapewnić obsługę żądania lub przekazuje to żądanie dalej, lub to i to.</p>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> Żądanie {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> String </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">title;
</span><span style="color: #800000;"> 3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">value;
</span><span style="color: #800000;"> 4
 5 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> Żądanie(String title, </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> value) {
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">title </span><span style="background-color:#ffffff;">= title;
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">value </span><span style="background-color:#ffffff;">= value;
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;"> 9
10 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> print() {
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">title </span><span style="background-color:#ffffff;">+ </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">" "</span><span style="background-color:#ffffff;"> + </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">value)</span><span style="background-color:#ffffff;">;
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">13
14 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> getValue() {
</span><span style="color: #800000;">15 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">value;
</span><span style="color: #800000;">16 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">17 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">18 </span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">abstract</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> Łapacz {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">protected</span><span style="background-color:#ffffff;"> Łapacz </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">następca;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> setNastępca(Łapacz łapacz) {
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">następca </span><span style="background-color:#ffffff;">= łapacz;
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;"> 7
 8 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">abstract</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> łapŻądanie(Żądanie żądanie);
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">10 </span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> ŁapaczNegatywny </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">extends</span><span style="background-color:#ffffff;"> Łapacz {
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> łapŻądanie(Żądanie żądanie) {
</span><span style="color: #800000;"> 4 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (żądanie.getValue() &lt; </span><span style="background-color: #ffffff; color: #0000ff;">0</span><span style="background-color:#ffffff;">) {
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">            System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Łapacz negatywny łapie wartości mniejsze niż 0"</span><span style="background-color:#ffffff;">);
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">            żądanie.print();
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">        } </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">else</span><span style="background-color:#ffffff;"> {
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">            </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">następca </span><span style="background-color:#ffffff;">!= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">null</span><span style="background-color:#ffffff;">)
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">                </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">następca.</span><span style="background-color:#ffffff;">łapŻądanie(żądanie);
</span><span style="color: #800000;">10 </span><span style="background-color:#ffffff;">        }
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">13 </span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> ŁapaczPozytywny </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">extends</span><span style="background-color:#ffffff;"> Łapacz {
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> łapŻądanie(Żądanie żądanie) {
</span><span style="color: #800000;"> 4 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (żądanie.getValue() &gt; </span><span style="background-color: #ffffff; color: #0000ff;">0</span><span style="background-color:#ffffff;">) {
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">            System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Łapacz pozytywny łapie wartości większe niż 0"</span><span style="background-color:#ffffff;">);
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">            żądanie.print();
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">        } </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">else</span><span style="background-color:#ffffff;"> {
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">            </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">następca </span><span style="background-color:#ffffff;">!= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">null</span><span style="background-color:#ffffff;">)
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">                </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">następca.</span><span style="background-color:#ffffff;">łapŻądanie(żądanie);
</span><span style="color: #800000;">10 </span><span style="background-color:#ffffff;">        }
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">}</span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> ŁapaczNeutralny </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">extends</span><span style="background-color:#ffffff;"> Łapacz {
</span><span style="color: #800000;"> 2
 3 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> łapŻądanie(Żądanie żądanie) {
</span><span style="color: #800000;"> 4 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (żądanie.getValue() == </span><span style="background-color: #ffffff; color: #0000ff;">0</span><span style="background-color:#ffffff;">) {
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">            System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Łapacz neutralny łapie wartości równe 0"</span><span style="background-color:#ffffff;">);
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">            żądanie.print();
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">        } </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">else</span><span style="background-color:#ffffff;"> {
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">            </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">następca </span><span style="background-color:#ffffff;">!= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">null</span><span style="background-color:#ffffff;">)
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">                </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">następca.</span><span style="background-color:#ffffff;">łapŻądanie(żądanie);
</span><span style="color: #800000;">10 </span><span style="background-color:#ffffff;">        }
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">}</span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> TesterŁapaczy {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> main(String[] args) {
</span><span style="color: #800000;"> 3 </span><span style="background-color:#ffffff;">        Łapacz łapacz1 = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> ŁapaczNegatywny();
</span><span style="color: #800000;"> 4 </span><span style="background-color:#ffffff;">        Łapacz łapacz2 = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> ŁapaczPozytywny();
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">        Łapacz łapacz3 = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> ŁapaczNeutralny();
</span><span style="color: #800000;"> 6
 7 </span><span style="background-color:#ffffff;">        łapacz1.setNastępca(łapacz2);
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">        łapacz2.setNastępca(łapacz3);
</span><span style="color: #800000;"> 9
10 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość negatywna "</span><span style="background-color:#ffffff;">, -</span><span style="background-color: #ffffff; color: #0000ff;">5</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość pozytywna "</span><span style="background-color:#ffffff;">, </span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość negatywna "</span><span style="background-color:#ffffff;">, -</span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">13 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość negatywna "</span><span style="background-color:#ffffff;">, -</span><span style="background-color: #ffffff; color: #0000ff;">2</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">14 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość neutralna "</span><span style="background-color:#ffffff;">, </span><span style="background-color: #ffffff; color: #0000ff;">0</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">15 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość negatywna "</span><span style="background-color:#ffffff;">, -</span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">16 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość pozytywna "</span><span style="background-color:#ffffff;">, </span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">17 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość neutralna "</span><span style="background-color:#ffffff;">, </span><span style="background-color: #ffffff; color: #0000ff;">0</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">18 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość pozytywna "</span><span style="background-color:#ffffff;">, </span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">19 </span><span style="background-color:#ffffff;">        łapacz1.łapŻądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Żądanie(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wartość negatywna "</span><span style="background-color:#ffffff;">, -</span><span style="background-color: #ffffff; color: #0000ff;">1</span><span style="background-color:#ffffff;">));
</span><span style="color: #800000;">20 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">21 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">22 </span></pre>
<p>Diagram wzorca:</p>
<p><a href="http://marioosh.5dots.pl/wp-content/uploads/chains.png"><img class="aligncenter size-medium wp-image-231" title="chains" src="http://marioosh.5dots.pl/wp-content/uploads/chains-300x216.png" alt="" width="300" height="216" /></a></p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-chain-of-responsibility%2F&amp;linkname=Wzorce%20projektowe%3A%20Chain%20of%20Responsibility" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/" title="Wzorce projektowe: Interpreter">Wzorce projektowe: Interpreter</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/" title="Wzorce projektowe: Memento">Wzorce projektowe: Memento</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-chain-of-responsibility/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Wzorce projektowe: Iterator</title>
		<link>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-iterator/</link>
		<comments>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-iterator/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 21:16:36 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=227</guid>
		<description><![CDATA[Iterator jest operacyjnym wzorcem projektowym, którym zapewnia metodę dostępu sekwencyjnego do elementów obiektu zagregowanego bez ujawniania jego reprezentacji wewnętrznej.
Obecnie od czasu java 5 i pojawieniu się typów generycznych wzorzec iteratora stracił na wadze. Typy generyczne pełnią kontrolę nad zwracanymi obiektami. Każda kolekcja też, posiada metodę iterator, która zwraca jej iterator. Jeżeli chcemy więc użyć własnego, [...]]]></description>
			<content:encoded><![CDATA[<p>Iterator jest operacyjnym wzorcem projektowym, którym zapewnia metodę dostępu sekwencyjnego do elementów obiektu zagregowanego bez ujawniania jego reprezentacji wewnętrznej.<br />
Obecnie od czasu java 5 i pojawieniu się typów generycznych wzorzec iteratora stracił na wadze. Typy generyczne pełnią kontrolę nad zwracanymi obiektami. Każda kolekcja też, posiada metodę iterator, która zwraca jej iterator. Jeżeli chcemy więc użyć własnego, najlepiej w tym celu udekorować kolekcję, dodając funkcjonalności do iteratora.<br />
Przykład iteratora:</p>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">interface</span><span style="background-color:#ffffff;"> Iterator {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">boolean</span><span style="background-color:#ffffff;"> hasNext();
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> Object next();
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;"> 6 </span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">interface</span><span style="background-color:#ffffff;"> Containter {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> Iterator getIterator();
</span><span style="color: #800000;"> 3 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;"> 4 </span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> BooksCollection </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color:#ffffff;"> Containter
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">{
</span><span style="color: #800000;"> 3 </span><span style="background-color:#ffffff;">	</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> String </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">titles[</span><span style="background-color:#ffffff;">] = {</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Design Patterns"</span><span style="background-color:#ffffff;">,</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"1"</span><span style="background-color:#ffffff;">,</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"2"</span><span style="background-color:#ffffff;">,</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"3"</span><span style="background-color:#ffffff;">,</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"4"</span><span style="background-color:#ffffff;">};
</span><span style="color: #800000;"> 4
 5 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> Iterator getIterator()
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">	{
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">		BookIterator result = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> BookIterator();
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">		</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> result;
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">	}
</span><span style="color: #800000;">10
11
12 </span><span style="background-color:#ffffff;">	</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> BookIterator </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color:#ffffff;"> Iterator
</span><span style="color: #800000;">13 </span><span style="background-color:#ffffff;">	{
</span><span style="color: #800000;">14 </span><span style="background-color:#ffffff;">		</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">position;
</span><span style="color: #800000;">15
16 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">boolean</span><span style="background-color:#ffffff;"> hasNext()
</span><span style="color: #800000;">17 </span><span style="background-color:#ffffff;">		{
</span><span style="color: #800000;">18 </span><span style="background-color:#ffffff;">			</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">position </span><span style="background-color:#ffffff;">&lt; </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">titles.length)
</span><span style="color: #800000;">19 </span><span style="background-color:#ffffff;">				</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">true</span><span style="background-color:#ffffff;">;
</span><span style="color: #800000;">20 </span><span style="background-color:#ffffff;">			</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">else
</span><span style="color: #800000;">21 </span><span style="background-color:#ffffff;">				</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">false</span><span style="background-color:#ffffff;">;
</span><span style="color: #800000;">22 </span><span style="background-color:#ffffff;">		}
</span><span style="color: #800000;">23 </span><span style="background-color:#ffffff;">		</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> Object next()
</span><span style="color: #800000;">24 </span><span style="background-color:#ffffff;">		{
</span><span style="color: #800000;">25 </span><span style="background-color:#ffffff;">			</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.hasNext())
</span><span style="color: #800000;">26 </span><span style="background-color:#ffffff;">				</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">titles[position++</span><span style="background-color:#ffffff;">];
</span><span style="color: #800000;">27 </span><span style="background-color:#ffffff;">			</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">else
</span><span style="color: #800000;">28 </span><span style="background-color:#ffffff;">				</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">null</span><span style="background-color:#ffffff;">;
</span><span style="color: #800000;">29 </span><span style="background-color:#ffffff;">		}
</span><span style="color: #800000;">30 </span><span style="background-color:#ffffff;">	}
</span><span style="color: #800000;">31 </span><span style="background-color:#ffffff;">}</span></pre>
<p>Diagram wzorca:</p>
<p><a href="http://marioosh.5dots.pl/wp-content/uploads/iterator.png"><img class="aligncenter size-medium wp-image-228" title="iterator" src="http://marioosh.5dots.pl/wp-content/uploads/iterator-255x300.png" alt="" width="255" height="300" /></a></p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-iterator%2F&amp;linkname=Wzorce%20projektowe%3A%20Iterator" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/" title="Wzorce projektowe: Interpreter">Wzorce projektowe: Interpreter</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/" title="Wzorce projektowe: Memento">Wzorce projektowe: Memento</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-iterator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wzorce projektowe: Flyweight</title>
		<link>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-flyweight/</link>
		<comments>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-flyweight/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 20:54:56 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=224</guid>
		<description><![CDATA[Flyweight jest strukturalnym wzorcem projektowym, którego zadaniem jest zmniejszenie ilości instancji klas w aplikacji. Jest bardzo zbliżony do Singleton&#8217;a i często Singleton jest wykorzystywany we wzorcu Flyweight.
Czasami zdaża się, że potrzebujemy na prawdę wielkiej ilości małych obiektów. Np. rysując zawartość folderu, możemy stworzyć obiekt katalogu lub pliku dla każdego obecnego w systemie. Może to doprowadzić [...]]]></description>
			<content:encoded><![CDATA[<p>Flyweight jest strukturalnym wzorcem projektowym, którego zadaniem jest zmniejszenie ilości instancji klas w aplikacji. Jest bardzo zbliżony do Singleton&#8217;a i często Singleton jest wykorzystywany we wzorcu Flyweight.<br />
Czasami zdaża się, że potrzebujemy na prawdę wielkiej ilości małych obiektów. Np. rysując zawartość folderu, możemy stworzyć obiekt katalogu lub pliku dla każdego obecnego w systemie. Może to doprowadzić do niepotrzebnego zuzycia zasobów. Te obiekty tak na prawdę nie różnią się wiele, ikonka taka sama tylko nazwa inna.<br />
W takiej sytuacji wykorzystuje się wzorzec Flywieght. Jego zadaniem jest stworzenie jednego obiektu, którego dane są delegowane do innego miejsca. Zamiast tworzyć kilkaset małych obiektów, tworzy się jeden, a jako paramter podaje się to co jest zmienne. Tworzy się jedną instancję dla rodzaju obiektu. Więc np, folder i folder zaznaczony (który ma inną ikonkę) to dwa różne obiekty.</p>
<p>Spójrzmy na przykład:<br />
Potrzebujemy narysować serię przycisków. Stworzyliśmy klasę FlyweightButton, która za pomocą metody <em>draw</em>() rysuje je na ekranie. Przyciski są podobne, różnią sie tylko nazwą więc trzeba będzie ograniczyć liczbę instancji w systemie do minimum. Jako pomocnika napisaliśmy klasę FlyweightButtonManager, która zarządza pulą przycisków. Akurat w każdym rzędzie przycisk ma inną ikonkę więc dla każdego rzędu jest wywoływana nowa instancja klasy. Działanie managera jest podobne do działania singletona. gdy wywoływana jest metoda <em>getFlyweightButton()</em> sprawdza się czy dla danego rzędu <em>FlyweightButton</em> juz instnieje, jeżeli nie &#8211; to tworzy się nowy &#8211; potem zwraca się go.<br />
zobaczmy:</p>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> FlyweightButton {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">label;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> FlyweightButton(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> label) {
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">label </span><span style="background-color:#ffffff;">= label;
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Rodzina Flyweight Buttonów:"</span><span style="background-color:#ffffff;"> + label);
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;"> 8
 9 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> draw(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> num) {
</span><span style="color: #800000;">10 </span><span style="background-color:#ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">label </span><span style="background-color:#ffffff;">+ </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">" "</span><span style="background-color:#ffffff;"> + num + </span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">" "</span><span style="background-color:#ffffff;"> + </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.hashCode());
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">13 </span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> FlyweightButtonManager {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> FlyweightButton[] </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">pool;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> FlyweightButtonManager(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> maxRows) {
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">pool </span><span style="background-color:#ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> FlyweightButton[maxRows];
</span><span style="color: #800000;"> 6
 7 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;"> 8
 9 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> FlyweightButton getFlyweightButton(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> col) {
</span><span style="color: #800000;">10 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color:#ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">pool[</span><span style="background-color:#ffffff;">col] == </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">null</span><span style="background-color:#ffffff;">) { <span style="color: #c0c0c0;">//sprawdzamy czy Button już jest</span>
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">            </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">pool[</span><span style="background-color:#ffffff;">col] = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> FlyweightButton(col);<span style="color: #c0c0c0;">// jak nie to tworzymy nowy</span>
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">        }
</span><span style="color: #800000;">13 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">return</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">pool[</span><span style="background-color:#ffffff;">col];<span style="color: #c0c0c0;">// i go zwracamy</span>
</span><span style="color: #800000;">14 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">15
16 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">17 </span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> FlyweightDemo {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">final</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">ROWS </span><span style="background-color:#ffffff;">= </span><span style="background-color: #ffffff; color: #0000ff;">6</span><span style="background-color:#ffffff;">, </span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">COLS </span><span style="background-color:#ffffff;">= </span><span style="background-color: #ffffff; color: #0000ff;">10</span><span style="background-color:#ffffff;">;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> main(String[] args) {
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">        FlyweightButtonManager manager = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> FlyweightButtonManager(</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">ROWS)</span><span style="background-color:#ffffff;">;
</span><span style="color: #800000;"> 6 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">for</span><span style="background-color:#ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> i = </span><span style="background-color: #ffffff; color: #0000ff;">0</span><span style="background-color:#ffffff;">; i &lt; </span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">ROWS;</span><span style="background-color:#ffffff;"> i++) {
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">            </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">for</span><span style="background-color:#ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">int</span><span style="background-color:#ffffff;"> j = </span><span style="background-color: #ffffff; color: #0000ff;">0</span><span style="background-color:#ffffff;">; j &lt; </span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">COLS;</span><span style="background-color:#ffffff;"> j++) {
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">                manager.getFlyweightButton(i).draw(j);
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">            }
</span><span style="color: #800000;">10 </span><span style="background-color:#ffffff;">        }
</span><span style="color: #800000;">11 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">12 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">13 </span></pre>
<p>Dla uwidocznienia w naszym przykładzie umieściłem kod, który drukuje HashCode aby upewnić się, że wszystkie wywołane Buttony są tej samej instancji.</p>
<p>Diagram wzorca:<a href="http://marioosh.5dots.pl/wp-content/uploads/flyweight.png"><img class="aligncenter size-medium wp-image-225" title="flyweight" src="http://marioosh.5dots.pl/wp-content/uploads/flyweight-300x176.png" alt="" width="300" height="176" /></a></p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-flyweight%2F&amp;linkname=Wzorce%20projektowe%3A%20Flyweight" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/" title="Wzorce projektowe: Interpreter">Wzorce projektowe: Interpreter</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/" title="Wzorce projektowe: Memento">Wzorce projektowe: Memento</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-flyweight/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wzorce projektowe: State</title>
		<link>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-state/</link>
		<comments>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-state/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 18:20:41 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=221</guid>
		<description><![CDATA[Wzorzec State jest wzorcem operacyjnym, który posiada wiele implementacji i może się przełączać pomiędzy nimi podczas działania programu. Zmiana może być spowodowana interakcją użytkownika lub też automatycznie przez klasę kliencką jako odpowiedź na wykonaną akcję. Korzystanie z wzorca eliminuje wiele instrukcji warunkowych z kodu, które uzależnieją wykonane operacji od odpowiedniego warunku. W state takie warunki [...]]]></description>
			<content:encoded><![CDATA[<p>Wzorzec State jest wzorcem operacyjnym, który posiada wiele implementacji i może się przełączać pomiędzy nimi podczas działania programu. Zmiana może być spowodowana interakcją użytkownika lub też automatycznie przez klasę kliencką jako odpowiedź na wykonaną akcję. Korzystanie z wzorca eliminuje wiele instrukcji warunkowych z kodu, które uzależnieją wykonane operacji od odpowiedniego warunku. W state takie warunki przeniesione są do oddzielnych klas.</p>
<p>Spójrzmy na kod:</p>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> BadStateKlas {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">boolean</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">warunek </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">true</span><span style="background-color: #ffffff;">;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> main(String[] args) {
</span><span style="color: #800000;"> 5 </span><span style="background-color: #ffffff;">        BadStateKlas bad = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> BadStateKlas();
</span><span style="color: #800000;"> 6 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 7
 8 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> BadStateKlas() {
</span><span style="color: #800000;"> 9
10 </span><span style="background-color: #ffffff;">        metoda1();
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">        metoda2();
</span><span style="color: #800000;">12
13 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">14
15 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> metoda1() {
</span><span style="color: #800000;">16 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-style: italic; color: #808080;">//kod wykonujemy gdy wartość pola 'warunek' jest = true
</span><span style="color: #800000;">17 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color: #ffffff;"> (</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">warunek)</span><span style="background-color: #ffffff;"> {
</span><span style="color: #800000;">18 </span><span style="background-color: #ffffff;">            System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wykonuję metodę 1"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">19 </span><span style="background-color: #ffffff;">        } </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">else</span><span style="background-color: #ffffff;"> {
</span><span style="color: #800000;">20 </span><span style="background-color: #ffffff;">            System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Nie wykonuję metody 1"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">21 </span><span style="background-color: #ffffff;">        }
</span><span style="color: #800000;">22 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">23
24 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> metoda2() {
</span><span style="color: #800000;">25 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-style: italic; color: #808080;">// kod wykonujemy gdy wartość pola 'warunek' jest = false
</span><span style="color: #800000;">26 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">if</span><span style="background-color: #ffffff;"> (!</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">warunek)</span><span style="background-color: #ffffff;"> {
</span><span style="color: #800000;">27 </span><span style="background-color: #ffffff;">            System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wykonuję metodę 2"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">28 </span><span style="background-color: #ffffff;">        } </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">else</span><span style="background-color: #ffffff;"> {
</span><span style="color: #800000;">29 </span><span style="background-color: #ffffff;">            System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Nie wykonuję metody 2"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;">30 </span><span style="background-color: #ffffff;">        }
</span><span style="color: #800000;">31 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">32 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">33 </span></pre>
<p>Kod wykonywany w metodach 1 i 2 jest zależny od wartości pola &#8216;warunek&#8217;. A co jeżeli będę trzy możliwości? Pole <span style="font-style: italic;">warunek</span> trzeba będzie zmienić z boolean na int lub Enum, a listy &#8216;ifów&#8217; będą coraz dłuższe. Zamiast tego ustawimy pole stan dla klasy, a kod zależny od tego pola umieścimy w zewnętrznych klasach.<br />
Interfejs:</p>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">interface</span><span style="background-color:#ffffff;"> Warunek {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> metoda1();
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> metoda2();
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;"> 6 </span></pre>
<p>Poszczególne stany:</p>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> Warunek1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color:#ffffff;"> Warunek{
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> metoda1() {
</span><span style="color: #800000;"> 3 </span><span style="background-color:#ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wykonuję metodę 1"</span><span style="background-color:#ffffff;">);
</span><span style="color: #800000;"> 4 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;"> 5
 6 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> metoda2() {
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Nie wykonuję metody 2"</span><span style="background-color:#ffffff;">);
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">10 </span></pre>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> Warunek2 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color:#ffffff;"> Warunek{
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> metoda1() {
</span><span style="color: #800000;"> 3 </span><span style="background-color:#ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Nie wykonuję metody 1"</span><span style="background-color:#ffffff;">);
</span><span style="color: #800000;"> 4 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;"> 5
 6 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> metoda2() {
</span><span style="color: #800000;"> 7 </span><span style="background-color:#ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color:#ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wykonuję metodę 2"</span><span style="background-color:#ffffff;">);
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;"> 9 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">10 </span></pre>
<p>klasa klienta:</p>
<pre style="line-height: 120%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color:#ffffff;"> GoodState {
</span><span style="color: #800000;"> 2 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color:#ffffff;"> Warunek </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">warunek;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> GoodState(Warunek warunek) {
</span><span style="color: #800000;"> 5 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">warunek </span><span style="background-color:#ffffff;">= warunek;
</span><span style="color: #800000;"> 6
 7 </span><span style="background-color:#ffffff;">        warunek.metoda1();
</span><span style="color: #800000;"> 8 </span><span style="background-color:#ffffff;">        warunek.metoda2();
</span><span style="color: #800000;"> 9
10 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">11
12 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> setWarunek(Warunek warunek) {
</span><span style="color: #800000;">13 </span><span style="background-color:#ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color:#ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">warunek </span><span style="background-color:#ffffff;">= warunek;
</span><span style="color: #800000;">14 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">15
16 </span><span style="background-color:#ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">static</span><span style="background-color:#ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color:#ffffff;"> main(String[] args) {
</span><span style="color: #800000;">17 </span><span style="background-color:#ffffff;">        GoodState state = </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> GoodState(</span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color:#ffffff;"> Warunek1());
</span><span style="color: #800000;">18 </span><span style="background-color:#ffffff;">    }
</span><span style="color: #800000;">19 </span><span style="background-color:#ffffff;">}
</span><span style="color: #800000;">20 </span></pre>
<p>Diagram wzorca:</p>
<p><a href="http://marioosh.5dots.pl/wp-content/uploads/state.png"><img class="aligncenter size-medium wp-image-222" title="state" src="http://marioosh.5dots.pl/wp-content/uploads/state-300x233.png" alt="" width="300" height="233" /></a></p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-state%2F&amp;linkname=Wzorce%20projektowe%3A%20State" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/" title="Wzorce projektowe: Interpreter">Wzorce projektowe: Interpreter</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/" title="Wzorce projektowe: Memento">Wzorce projektowe: Memento</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-state/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wzorce projektowe: Proxy</title>
		<link>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-proxy/</link>
		<comments>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-proxy/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 17:08:58 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Wzorce Projektowe]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[wzorce projektowe]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=217</guid>
		<description><![CDATA[Proxy jest strukturalnym wzorcem projektowym wykorzystywanym do reprezentowania skomplikowanego obiektu lub obiektu, którego utworzenie wymaga dużego nakładu czasu, za pomocą obiektu prostego. Jeżeli tworzenie obiektu jest czasochłonne lub zasobożerne, Proxy pozwala odłożyć akt tworzenia tego obiektu na czas, w którym ten obiekt rzeczywiście będzie potrzebny. Proxy ma taki sam interfejs jak obiekt którego reprezentuje ( [...]]]></description>
			<content:encoded><![CDATA[<p>Proxy jest strukturalnym wzorcem projektowym wykorzystywanym do reprezentowania skomplikowanego obiektu lub obiektu, którego utworzenie wymaga dużego nakładu czasu, za pomocą obiektu prostego. Jeżeli tworzenie obiektu jest czasochłonne lub zasobożerne, Proxy pozwala odłożyć akt tworzenia tego obiektu na czas, w którym ten obiekt rzeczywiście będzie potrzebny. Proxy ma taki sam interfejs jak obiekt którego reprezentuje ( a tak właściwie to nie muszą implementować tego samego interfejsy &#8211; wymagane jest tylko aby proxy posiadało definicje wszystkich metod obiektu docelowego). Kiedy pełny obiekt zostanie stworzony, Proxy przekazuje do niego wszystkie wywołania metod.<br />
Proxy stosuje się:<br />
- kiedy obiekt potrzebuje dużo czasu na załadowanie,<br />
- kiedy obiekt znajduje się na odległej maszynie i ładowanie go przez sieć może być długotrwałe,<br />
- kiedy chcemy aby prawa dostępu do obiektu były ograniczone &#8211; proxy sprawdza uprawnienia użytkownika, przed załadowaniem odpowiedniego obiektu.<br />
Bardzo często wzorzec proxy wykorzystuje się wraz z mechanizmami RMI.<br />
Rodzaje proxy:<br />
<span style="font-weight: bold;">Copy-On-Write Proxy</span> &#8211; odracza kopiowanie obiektu docelowego do momentu kiedy jest potrzebny klientowi,<br />
<span style="font-weight: bold;">Protection Proxy</span> &#8211; różnym klientom dostarcza różny poziom dostępu do obiektu docelowego,<br />
<span style="font-weight: bold;">Cache Proxy</span> &#8211; w tymczasowej pamięci przechowuje wyniki kosztownych operacji obiektu docelowego, po to by klienci mogli je dzielić,<br />
<span style="font-weight: bold;">Firewall Proxy</span> &#8211; chroni obiekt docelowy przed niepowołowanymi klientami,<br />
<span style="font-weight: bold;">Smart Reference Proxy</span> &#8211; dostarcza dodatkowe operacje w momencie odwołania do obiektu docelowego, jak np. liczba odwołań do obiektu docelowego.</p>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">interface</span><span style="background-color: #ffffff;"> ProxyBase {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> metoda();
</span><span style="color: #800000;"> 3 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;"> 4 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Implementacja </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color: #ffffff;"> ProxyBase{
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> metoda() {
</span><span style="color: #800000;"> 3 </span><span style="background-color: #ffffff;">        System.</span><span style="background-color: #ffffff; font-weight: bold; font-style: italic; color: #660e7a;">out.</span><span style="background-color: #ffffff;">println(</span><span style="background-color: #ffffff; font-weight: bold; color: #008000;">"Wykonuję metodę: metoda"</span><span style="background-color: #ffffff;">);
</span><span style="color: #800000;"> 4 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 5 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;"> 6 </span></pre>
<pre style="border: 0.01mm solid #000000; padding: 4px; line-height: 120%; font-family: monospace; background-color: #ffffff;"><span style="color: #800000;"> 1 </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">class</span><span style="background-color: #ffffff;"> Proxy </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">implements</span><span style="background-color: #ffffff;"> ProxyBase {
</span><span style="color: #800000;"> 2 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">private</span><span style="background-color: #ffffff;"> Implementacja </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">implementacja;
</span><span style="color: #800000;"> 3
 4 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> Proxy() {
</span><span style="color: #800000;"> 5 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">this</span><span style="background-color: #ffffff;">.</span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">implementacja </span><span style="background-color: #ffffff;">= </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">new</span><span style="background-color: #ffffff;"> Implementacja();
</span><span style="color: #800000;"> 6 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;"> 7
 8 </span><span style="background-color: #ffffff;">    </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">public</span><span style="background-color: #ffffff;"> </span><span style="background-color: #ffffff; font-weight: bold; color: #000080;">void</span><span style="background-color: #ffffff;"> metoda() {
</span><span style="color: #800000;"> 9 </span><span style="background-color: #ffffff;">        </span><span style="background-color: #ffffff; font-weight: bold; color: #660e7a;">implementacja.</span><span style="background-color: #ffffff;">metoda();
</span><span style="color: #800000;">10 </span><span style="background-color: #ffffff;">    }
</span><span style="color: #800000;">11 </span><span style="background-color: #ffffff;">}
</span><span style="color: #800000;">12 </span></pre>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Wykop" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/wykop.png" width="16" height="16" alt="Wykop"/></a> <a href="http://www.addtoany.com/add_to/blip?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Blip" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blip.png" width="16" height="16" alt="Blip"/></a> <a href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Twitter" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a> <a href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Facebook" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a> <a href="http://www.addtoany.com/add_to/dzone?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="DZone" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/dzone.png" width="16" height="16" alt="DZone"/></a> <a href="http://www.addtoany.com/add_to/digg?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Digg" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/digg.png" width="16" height="16" alt="Digg"/></a> <a href="http://www.addtoany.com/add_to/blinklist?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Blinklist" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/blinklist.png" width="16" height="16" alt="Blinklist"/></a> <a href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Delicious" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a> <a href="http://www.addtoany.com/add_to/evernote?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Evernote" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/evernote.png" width="16" height="16" alt="Evernote"/></a> <a href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a> <a href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a> <a href="http://www.addtoany.com/add_to/google_buzz?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Google Buzz" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/google_buzz.png" width="16" height="16" alt="Google Buzz"/></a> <a href="http://www.addtoany.com/add_to/google_reader?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fwzorce-projektowe-proxy%2F&amp;linkname=Wzorce%20projektowe%3A%20Proxy" title="Google Reader" rel="nofollow" target="_blank"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/icons/reader.png" width="16" height="16" alt="Google Reader"/></a> <a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://marioosh.5dots.pl/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share/Bookmark"/></a> </p><h3  class="related_post_title">Podobne wpisy:</h3><ul class="related_post"><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-interpreter/" title="Wzorce projektowe: Interpreter">Wzorce projektowe: Interpreter</a></li><li>11.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-memento/" title="Wzorce projektowe: Memento">Wzorce projektowe: Memento</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/wzorce-projektowe-proxy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
