<?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; Java</title>
	<atom:link href="http://marioosh.5dots.pl/tag/java/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>Java, TMPDIR i MacOS X</title>
		<link>http://marioosh.5dots.pl/2009/10/java-tmpdir-i-macos-x/</link>
		<comments>http://marioosh.5dots.pl/2009/10/java-tmpdir-i-macos-x/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 09:48:44 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[java.io.tmpdir]]></category>
		<category><![CDATA[jBoss]]></category>
		<category><![CDATA[MacOS X]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=354</guid>
		<description><![CDATA[Prawie cały dzień spędziłem na bezefektywnej próbie uruchomienia starego jBossa wygrzebanego z backup&#8217;u na moim Macu. Po dłuższych analizach znalazłem przycznę. Otóż, podczas startu, serwer ustawiał zmienną java.io.tmpdir. W systemie MacOS X w takim momenie zostaje utworzony nowy folder w /private/var/folders.Problemem jest to, że w nazwie tego folderu występują znaki plus +, które przez niektóre [...]]]></description>
			<content:encoded><![CDATA[<p>Prawie cały dzień spędziłem na bezefektywnej próbie uruchomienia starego jBossa wygrzebanego z backup&#8217;u na moim Macu. Po dłuższych analizach znalazłem przycznę. Otóż, podczas startu, serwer ustawiał zmienną <code lang="bash">java.io.tmpdir</code>. W systemie MacOS X w takim momenie zostaje utworzony nowy folder w <code>/private/var/folders</code>.Problemem jest to, że w nazwie tego folderu występują znaki plus <code>+</code>, które przez niektóre mechanizmy (np. Xerces) są traktowane jako spacje. Obejściem tego problemu jest ustawienie parametru <code>java.io.tmpdir</code> w <code>JAVA_OPTS</code>. <code lang="bash">JAVA_OPTS="-Djava.io.tmpdir=/tmp/"</code>. Zmienna ta w przypadku serwera jBoss jest ustawiana w pliku run.conf, więc należy go edytować i dopisać co podałem.</p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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%2F10%2Fjava-tmpdir-i-macos-x%2F&amp;linkname=Java%2C%20TMPDIR%20i%20MacOS%20X" 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>07.07.2010 -- <a href="http://marioosh.5dots.pl/2010/07/pakowanie-aplikacji-za-pomoca-choctop/" title="Pakowanie aplikacji za pomocą ChocTop">Pakowanie aplikacji za pomocą ChocTop</a></li><li>01.06.2010 -- <a href="http://marioosh.5dots.pl/2010/06/to-ze-windows-jest/" title="To że Windows jest&#8230;">To że Windows jest&#8230;</a></li><li>04.11.2009 -- <a href="http://marioosh.5dots.pl/2009/11/mysql-i-snow-leopard/" title="Mysql i Snow Leopard">Mysql i Snow Leopard</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/10/java-tmpdir-i-macos-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projekt Euler</title>
		<link>http://marioosh.5dots.pl/2009/07/projekt-euler/</link>
		<comments>http://marioosh.5dots.pl/2009/07/projekt-euler/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 19:56:18 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Euler]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=334</guid>
		<description><![CDATA[Ostatnio szperając po sieci, natrafiłem na ciekawy aczkolwiek nie nowy projekt. Aż dziwne, że nie znalazłem go do tej pory. Projekt Euler bo o nim mowa przedstawia problemy, z którymi musimy się zmierzyć jako programiści. Problemy ułożone na granicy matematyki, kombinatoryki czy tam innej &#8220;yki&#8221; nie są w możliwe do rozwiązania bez komputera (no chyba, [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio szperając po sieci, natrafiłem na ciekawy aczkolwiek nie nowy projekt. Aż dziwne, że nie znalazłem go do tej pory. <a href="http://projecteuler.net">Projekt Euler</a> bo o nim mowa przedstawia problemy, z którymi musimy się zmierzyć jako programiści. Problemy ułożone na granicy matematyki, kombinatoryki czy tam innej &#8220;yki&#8221; nie są w możliwe do rozwiązania bez komputera (no chyba, że przez jakiegoś geniusza) Jako programiści mamy zadanie napisać program, który nam to zadanie rozwiąże. Sam projekt nie ocenia jakości naszego kodu bo podajemy tylko wynik i ten jest sprawdzany. Wiadomo jednak, że najlepiej jest się uczyć od innych albo na gotowych zadaniach, więc dla mnie projekt to jest strzał w 10-tkę. Zwłaszcza, że każdy problem (obecnie jest ich ponad 250) ma oddzielny topic na forum i można z innymi programistami podzielić się uwagami i wspólnie zoptymalizować kod, do najkrótszego/najlepszego. Co prawda w javie programuję, już prawie 10 lat, ale akurat zacząłem pisać kod w Ruby&#8217;m więc projekt będzie jak znalazł do potrenowania nowych technik.</p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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%2F07%2Fprojekt-euler%2F&amp;linkname=Projekt%20Euler" 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>06.09.2010 -- <a href="http://marioosh.5dots.pl/2010/09/rvm-gemset-dla-projektu/" title="RVM, gemset dla projektu">RVM, gemset dla projektu</a></li><li>18.08.2010 -- <a href="http://marioosh.5dots.pl/2010/08/ruby-1-9-2-juz-jest/" title="Ruby 1.9.2 już jest">Ruby 1.9.2 już jest</a></li><li>05.08.2010 -- <a href="http://marioosh.5dots.pl/2010/08/bash-completion-for-rvm/" title="Bash completion for RVM">Bash completion for RVM</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/07/projekt-euler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>dobry kod &#8211; na skróty</title>
		<link>http://marioosh.5dots.pl/2009/02/dobry-kod-na-skroty/</link>
		<comments>http://marioosh.5dots.pl/2009/02/dobry-kod-na-skroty/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 22:07:32 +0000</pubDate>
		<dc:creator>Marioosh</dc:creator>
				<category><![CDATA[Ogólne]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://marioosh.5dots.pl/?p=249</guid>
		<description><![CDATA[Każdy kiedyś uczył się pisać. Najpierw rysując szlaczki aby opanować kontrolę nad dłonią, potem literka za literką cały alfabet. Gdy już się nauczyliśmy &#8211; charakter pisma wyrabiał się wraz z ilością zapisanego tekstu. Jednak niektórzy starali stawiać równe, okrągłe literki, starali się robić równe odstępy między wyrazami. Tak długo, aż mieli ładny, czytelny charakter pisma. [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm;">Każdy kiedyś uczył się pisać. Najpierw rysując szlaczki aby opanować kontrolę nad dłonią, potem literka za literką cały alfabet. Gdy już się nauczyliśmy &#8211; charakter pisma wyrabiał się wraz z ilością zapisanego tekstu. Jednak niektórzy starali stawiać równe, okrągłe literki, starali się robić równe odstępy między wyrazami. Tak długo, aż mieli ładny, czytelny charakter pisma. Ale nie wszyscy się starają – większość pisze tak jak leci.</p>
<p style="margin-bottom: 0cm;">Tak samo jest z programistami. Gdy nauczą się podstaw programowania – nabierają doświadczenia poprzez pisanie programów i&#8230;. to wszystko. Pisanie programów w stylu: „ważne, że działa” i doświadczenie jedynie poprzez własnoręcznie napisany kod. Ale nie każdy taki jest. Niektórzy chcą pisać dobry kod – starają się, uczą nowych rzeczy, analizują inne programy, aby zobaczyć jak piszą inni. Dążą do pisania kodu w jak najlepszym stylu.</p>
<p style="margin-bottom: 0cm;">Jak jednak wygląda dobry kod? Jak się go pisze? Czterowersem z rymem naprzemiennym?</p>
<p style="margin-bottom: 0cm;">Jak można ocenić, że kod jest dobry?</p>
<p style="margin-bottom: 0cm;">Przez tyle lat gdy na świecie są komputery narodziło się mnóstwo autorytetów z dziedziny programowania. Powstały też kanony, standardy i przede wszystkim dobre style programowania. Po tych wszystkich latach można także ocenić który kod jest dobrze napisany.</p>
<p style="margin-bottom: 0cm;">Przede wszystkim program powinien być bardziej przemyślany niż napisany. Czym więcej czasu poświęcimy na projektowanie i analizę, tym więcej czasu zaoszczędzimy na programowaniu.</p>
<p style="margin-bottom: 0cm;">Przed przystąpieniem do pracy na programem powinniśmy wiedzieć co, gdzie i jak powinno w programie funkcjonować. Które klasy powinny znaleźć się w programie, co powinny wykonywać i jak się nazywać, a także z którymi innymi klasami powinny być połączone.</p>
<p style="margin-bottom: 0cm;">Na samym początku powinniśmy zadać sobie pytanie CO ten program (lub pojedynczy moduł programu) powinien robić lub CZYM powinien być. Musimy się zastanowić jakie warunki program musi spełniać aby dobrze działał – czyli wykonywał to co powinien. Pamiętaj: niezależnie gdzie  pracujesz, jakie oprogramowanie tworzysz oraz jakiego języka programowania używasz – jednego możesz być pewien: <span style="text-decoration: underline;">wymagania się zmieniają</span>. Dobrze napisany program pozwoli nam na szybkie zmodyfikowanie i dostosowanie programu do nowych wymagań.</p>
<p style="margin-bottom: 0cm;">Powinniśmy napisać przypadki użycia. Są to napisane krok po kroku działania programu. Może to bardzo pomóc przy projektowaniu programu. Analizując później tak sporządzony przypadek użycia – możemy rzeczowniki w nim użyte uznać jako klasy a czasowniki jako metody.</p>
<p style="margin-bottom: 0cm;">Nazwy klas powinny jednoznacznie wskazywać czym klasa jest, a nazwy metod &#8211;  jakie czynności wykonują. Każdy obiekt reprezentuje jedno pojęcie (przynajmniej powinien). Nie używa się obiektów realizujących dwa lub więcej obowiązków. Jeżeli przeglądając właściwości obiektu znajdujemy właściwości o wartości null lub w ogóle nie wykorzystywane, to może oznaczać, że obiekt pełni kilka ról.	Jeżeli takie właściwości istnieją, a jesteśmy pewni, że obiekt pełni tylko jedną rolę w systemie to nieużywane właściwości powinniśmy wywalić do oddzielnej klasy. Cały kod który może ulec zmianie oddzielamy od tego który nie ulegnie zmianie. Takie działanie nazywa się hermetyzacją.</p>
<p style="margin-bottom: 0cm;">Jeżeli wydzielimy to, co może się zmienić, a potem faktycznie się zmieni – a zmiany które to spowoduje będziemy musieli dokonać w klasach innych niż wyodrębniona – to oznacza, że hermetyzacja jest źle wykonana.</p>
<p style="margin-bottom: 0cm;">Obiekt powinien mieć tylko jedno zadanie a wszystkie usługi powinny się koncentrować na jego realizacji. Bardzo łatwo sprawdzić czy ta zasada jest zachowana. Wystarczy dla każdej metody utworzyć zdanie gdzie nazwa metody jest czasownikiem, nazwa klasy podmiotem a obiekty podane jako parametry metody mogą służyć jako dodatkowe rzeczowniki (chyba że parametr jest nieistotny bo np. tylko zmienia ilość lub szyk). Gdy metoda jest bez parametrów dodajemy „się”(może być w domyśle, chodzi o to, że metoda wykonuje czynność na samym sobie). Jeżeli utworzone w ten sposób zdanie łamie sens jego rzeczywistego odpowiednika to zasada jednej odpowiedzialności jest złamana. Np. klasa Obiad posiadająca metody: liczbaKalorii(), podajSkład(), ugotuj(). Porównując klasę do rzeczywistego obiektu obiad wiemy, że obiad jest w stanie podać SWOJĄ liczbę kalorii albo SWÓJ skład, ale SAM SIĘ NIE ugotuje. Więc metoda ugotuj() łamie tę zasadę. Obiad gotuje kucharz, czyli Kucharz.ugotuj(Obiad).</p>
<p style="margin-bottom: 0cm;">Analiza ta jednak w dużej mierze zależy od znajomości systemu. Np. w powyższym przykładzie metody Kucharz.ugotuj(Obiad) jest zgodna z zasadą jednej odpowiedzialności. A metoda Kucharz.ugotuj()? Czy jest zgodna? Na pierwszy rzut oka nie jest. Nie ma logicznego sensu aby kucharz SAM SIEBIE gotował. Jednak system może być zaprojektowany tak, że każdy obiad ma swojego kucharza i obiekt Obiad jest przekazywana obiektowi Kucharz jako parametr konstruktora. Zatem metoda ugotuj() wie, którego Obiadu użyć i nie potrzebuje go jako parametru. Mając tą wiedzę  &#8211; czy dalej twierdzimy, że metoda Kucharz.ugotuj() łamie zasadę jednej odpowiedzialności? Pamiętaj, że ocena o odpowiednim stosowaniu zasad ( lub ich łamaniu) jest wysoce zależna od znajomości systemu.</p>
<p style="margin-bottom: 0cm;">W naszym programie powinniśmy także odpowiednio zadbać o relacje między klasami. Rodzajów tychże nie ma dużo: dziedziczenie, implementacja lub asocjacja.</p>
<p style="margin-bottom: 0cm;">Z dziedziczeniem jest pewien problem. Dziedziczenie (czy też zgodnie z UML – generalizacja) powinno być wykonane w ten sposób aby była możliwość podstawienia typów pochodnych w miejsce ich typów bazowych (Zasada paradygmatu Liskov&#8217;a). Dziedziczenie w celu rozszerzenia funkcjonalności niesie za sobą ryzyko, że klasy pochodne nie będą potrzebne do ich działania i nie będą potrafiły tych metod zaadoptować. W takich sytuacjach należy poszukać innych rozwiązań, np. delegacja(jedna z grupy asoocjacji) lub kompozycja.</p>
<p style="margin-bottom: 0cm;">Kompozycja to jest używanie interfejsów. Z tym, że nie chodzi tylko o słowo kluczowe interface ale także klasy abstrakcyjne. Kompozycja pozwala stosować zachowanie udostępnione przez rodzinę innych klas i zmieniać to zachowanie w trakcie działania. Określamy w obiekcie, którym interfejsem jesteśmy zainteresowani (który realizuje niezbędne operacje) a w jego miejsce podsyłać klasy, które ten interfejs implementują. Stosują kompozycję nie jesteśmy uzależnieni od konkretnej implementacji. Kod jest elastyczny na rozszerzanie bo można utworzyć nową klasę o tym interfejsie  i ją podstawić. Używając interfejsów a nie klas które je implementują pozwoli na napisanie kodu dla klas, które nawet jeszcze nie istnieją. Kompozycja jest dobrym sposobem aby program był otwarty na rozszerzanie i podatny na zmiany, co jest bardzo ważne: powinniśmy starać się powodować aby raz napisany kod nie był modyfikowany. Jednocześnie napisać go tak aby szło go rozszerzyć, jeżeli nie przez kompozycję to np. przez dziedziczenie.</p>
<p style="margin-bottom: 0cm;">Nie ma lepszego sposobu na sprawdzenie czy pogram jest odporny na zmiany niż sama zmiana.</p>
<p style="margin-bottom: 0cm;">Innym typem relacji jest asocjacja, która oznacza zależność jednej klasy od drugiej. Utworzenie obiektu klasy A w obiekcie klasy B jest asocjacją. Są dwa główne rodzaje asocjacji: delegacja i agregacja. W delegacji obiekt który ma wykonać pewną czynność nie wykonuje jej, ale przekazuje jej wykonanie do innej klasy. W agregacji jeden obiekt jest częścią drugiego, np. obiekt Adres jest częścią obiektu Pracownik.</p>
<p style="margin-bottom: 0cm;">Częstym problemem jest nie odróżnienie kiedy używać agregacji a kiedy kompozycji. Agregację wykorzystujemy wtedy, gdy obiekt agregowany istnieje poza obiektem agregującym, jako oddzielny byt. Jeżeli obiekt agregowany nie musi mieć własnego bytu – używamy kompozycji.</p>
<p style="margin-bottom: 0cm;">Kolejną ważną zasadą jest unikanie powtarzania kodu. Najłatwiej tego dokonać poprzez wyodrębnienie wspólnych fragmentów i umieszczenie ich w jednym miejscu. Czyni to kod łatwiejszym w utrzymaniu i przy ewentualnych zmianach. Chodzi tu także o to, aby nie powtarzać funkcjonalności w kilku miejscach. W takim przypadku trzeba przenieść kod dotyczący tej funkcjonalności w jedno miejsce. Jednym słowem: należy się starać, aby każda informacja i operacja była tylko w jednym miejscu.</p>
<p style="margin-bottom: 0cm;">Pracując z dużym programem koncentruj się tylko na jednej możliwości naraz. Nie pozwól się zdekoncentrować i nie zajmuj się innymi możliwościami. Najpierw należy się skupiać na głównych funkcjonalnościach programu. Potem – wchodząc w głąb – programujemy kolejne funkcjonalności jedną po drugiej tak długo, aż będą napisane wszystkie z tego poziomu. Potem piszemy bardziej szczegółowe i tak dalej.</p>
<p style="margin-bottom: 0cm;">Drugą szkołą jest skupianie się na przypadkach użycia. Tworzymy scenariusz przejścia przez aplikację i piszemy kod aby ten scenariusz obsłużyć. Potem kolejny (inny) scenariusz i kod. Tak długo aż scenariuszami opiszemy wszystkie funkcjonalności programu.</p>
<p style="margin-bottom: 0cm;">Opanowanie tych zasad pomoże zaznajomienie się z wzorcami projektowymi – co i moim zdaniem jest wielce zalecane.</p>
<p style="margin-bottom: 0cm;">Mam nadzieję, że teraz pisany kod będzie prześliczny a jeszcze bardziej elastyczny <img src='http://marioosh.5dots.pl/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  – po prostu dobry kod.</p>
<p><a href="http://www.addtoany.com/add_to/wykop?linkurl=http%3A%2F%2Fmarioosh.5dots.pl%2F2009%2F02%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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%2Fdobry-kod-na-skroty%2F&amp;linkname=dobry%20kod%20%26%238211%3B%20na%20skr%C3%B3ty" 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>27.10.2009 -- <a href="http://marioosh.5dots.pl/2009/10/java-tmpdir-i-macos-x/" title="Java, TMPDIR i MacOS X">Java, TMPDIR i MacOS X</a></li><li>02.07.2009 -- <a href="http://marioosh.5dots.pl/2009/07/projekt-euler/" title="Projekt Euler">Projekt Euler</a></li><li>12.02.2009 -- <a href="http://marioosh.5dots.pl/2009/02/wzorce-projektowe-visitor/" title="Wzorce projektowe: Visitor">Wzorce projektowe: Visitor</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://marioosh.5dots.pl/2009/02/dobry-kod-na-skroty/feed/</wfw:commentRss>
		<slash:comments>0</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>
	</channel>
</rss>
