<?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>В поисках успеха &#187; oop</title>
	<atom:link href="http://sheremetov.com/category/oop/feed/" rel="self" type="application/rss+xml" />
	<link>http://sheremetov.com</link>
	<description>Блог оптимистичного менеджера проектов</description>
	<lastBuildDate>Tue, 03 Jan 2012 21:36:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Паттерн стратегия (Strategy)</title>
		<link>http://sheremetov.com/oop/oop-pattern-strategy/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-strategy/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 05:00:46 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=733</guid>
		<description><![CDATA[Паттерн стратегия используется для сокрытия (инкапсуляции) алгоритмов. То&#160;есть, у&#160;вас есть несколько путей решения одной и&#160;той&#160;же проблемы&#160;&#8212; сортировки строк, например, но&#160;они очень отличаются в&#160;производительности, требованиям к&#160;ресурсам и&#160;проч. Для этого вы&#160;реализуете несколько алгоритмов сортировки: Cортировку вставками (Insertion sort), сортирующую за&#160;конечное время и&#160;эффективному при небольших массивах, а&#160;также с&#160;частично отсортированными массивами Быструю сортировку (Quicksort), сортирующую быстрее, но&#160;требующую O(log n) [...]]]></description>
			<content:encoded><![CDATA[<p>Паттерн стратегия используется для сокрытия (инкапсуляции) алгоритмов. То&nbsp;есть, у&nbsp;вас есть несколько путей решения одной и&nbsp;той&nbsp;же проблемы&nbsp;&mdash; сортировки строк, например, но&nbsp;они очень отличаются в&nbsp;производительности, требованиям к&nbsp;ресурсам и&nbsp;проч. Для этого вы&nbsp;реализуете несколько алгоритмов сортировки:</p>
<ol>
<li><a href="http://ru.wikipedia.org/wiki/Сортировка_вставками">Cортировку вставками (Insertion sort)</a>, сортирующую за&nbsp;конечное время и&nbsp;эффективному при небольших массивах, а&nbsp;также с&nbsp;частично отсортированными массивами</li>
<li><a href="http://ru.wikipedia.org/wiki/Быстрая_сортировка">Быструю сортировку (Quicksort)</a>, сортирующую быстрее, но&nbsp;требующую O(log n) дополнительной памяти</li>
<li><a href="http://ru.wikipedia.org/wiki/Сортировка_подсчётом">Сортировку подсчетом (Counting sort)</a>, эффективный для большого количества данных с&nbsp;небольшим разбросом значений</li>
</ol>
<p>Далее, в&nbsp;зависимости от&nbsp;типа данных что у&nbsp;нас есть, и&nbsp;их&nbsp;объема, решаем какой алгоритм предпочтительнее использовать.</p>
<p>Вот как паттерн Стратегия, выглядит на&nbsp;UML&nbsp;диаграмме:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/05/strategy.gif"><img class="alignleft size-full wp-image-734" title="strategy" src="http://sheremetov.com/wp-content/uploads/2010/05/strategy.gif" alt="" width="437" height="164" /></a></p>
<p>А&nbsp;вот пример на&nbsp;языке java, из&nbsp;уже классической, игровой тематики:</p>
<pre class="java"><span style="color: #808080; font-style: italic;">// IUnitRender.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IUnitRender <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// UnitRender2D.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UnitRender2D <span style="color: #000000; font-weight: bold;">implements</span> IUnitRender <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;2D unit&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// UnitRender3D.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UnitRender3D <span style="color: #000000; font-weight: bold;">implements</span> IUnitRender <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;3D unit&quot;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// UnitSprite</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> UnitSprite <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> IUnitRender render;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> UnitSprite<span style="color: #66cc66;">&#40;</span>IUnitRender render<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">render</span> = render;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		render.<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TestApp.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">strategy</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestApp <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">void</span> main<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> args<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		UnitSprite unit;
&nbsp;
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>TestApp.<span style="color: #006600;">hasVideoAdapter</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			unit = <span style="color: #000000; font-weight: bold;">new</span> UnitSprite<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> UnitRender3D<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
			unit = <span style="color: #000000; font-weight: bold;">new</span> UnitSprite<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> UnitRender2D<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		unit.<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ABoolean+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Boolean</span></a> hasVideoAdapter<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">true</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-strategy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Паттерн фабричный метод (Factory method).</title>
		<link>http://sheremetov.com/oop/oop-pattern-factory-metho/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-factory-metho/#comments</comments>
		<pubDate>Wed, 12 May 2010 05:00:28 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=703</guid>
		<description><![CDATA[Еще один паттерн из группы порождающих - фабричный метод (factory method). Этот паттерн позволяет скрывать от клиента логику создания запрашиваемого объекта. Этот паттерн следует применять когда заранее неизвестно объекты каких классов должны быть созданы, поскольку предполагается множество различных вариантов работы, либо объекты, которые класс создает должны быть определены уже в подклассе. Пример применения паттерна на [...]]]></description>
			<content:encoded><![CDATA[<p>Еще один паттерн из группы порождающих - фабричный метод (factory method). Этот паттерн позволяет скрывать от клиента логику создания запрашиваемого объекта.<br />
Этот паттерн следует применять когда заранее неизвестно объекты каких классов должны быть созданы, поскольку предполагается множество различных вариантов работы, либо объекты, которые класс создает должны быть определены уже в подклассе.</p>
<p>Пример применения паттерна на UML диаграмме:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/05/factory.gif"><img class="alignleft size-full wp-image-706" title="factory" src="http://sheremetov.com/wp-content/uploads/2010/05/factory.gif" alt="" width="469" height="185" /></a></p>
<p>А вот, пример применения паттерна в коде, - класс создающий разные типы документов, из одинаковых составных частей:</p>
<pre class="java"><span style="color: #808080; font-style: italic;">// IChapter.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factorymethod</span>.<span style="color: #006600;">report</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IChapter <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> getType<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// IReport.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factorymethod</span>.<span style="color: #006600;">report</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IReport <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> addChapter<span style="color: #66cc66;">&#40;</span>IChapter chapter<span style="color: #66cc66;">&#41;</span>;	
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// CustomReport.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factorymethod</span>.<span style="color: #006600;">report</span>;
&nbsp;
<span style="color: #a1a100;">import java.util.ArrayList;</span>
<span style="color: #a1a100;">import java.util.Iterator;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomReport <span style="color: #000000; font-weight: bold;">implements</span> IReport <span style="color: #66cc66;">&#123;</span>	
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> ArrayList&lt;IChapter&gt; chapters = <span style="color: #000000; font-weight: bold;">new</span> ArrayList&lt;IChapter&gt;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;	
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>Iterator&lt;IChapter&gt; iter = chapters.<span style="color: #006600;">iterator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; iter.<span style="color: #006600;">hasNext</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;  <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>IChapter<span style="color: #66cc66;">&#41;</span>iter.<span style="color: #006600;">next</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getType</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> addChapter<span style="color: #66cc66;">&#40;</span>IChapter chapter<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		chapters.<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span>chapter<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ExtendedChapter.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factorymethod</span>.<span style="color: #006600;">report</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ExtendedChapter <span style="color: #000000; font-weight: bold;">implements</span> IChapter <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> getType<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;Extended&quot;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//  IndexChapter.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factorymethod</span>.<span style="color: #006600;">report</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> IndexChapter <span style="color: #000000; font-weight: bold;">implements</span> IChapter <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> getType<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;Index&quot;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// SmallChapter.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factorymethod</span>.<span style="color: #006600;">report</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> SmallChapter <span style="color: #000000; font-weight: bold;">implements</span> IChapter <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> getType<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;Small&quot;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TitleChapter.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factorymethod</span>.<span style="color: #006600;">report</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TitleChapter <span style="color: #000000; font-weight: bold;">implements</span> IChapter <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> getType<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;Title&quot;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ReportCreator.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factorymethod</span>.<span style="color: #006600;">report</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ReportCreator <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> IReport createSummaryReport<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		CustomReport report = <span style="color: #000000; font-weight: bold;">new</span> CustomReport<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		report.<span style="color: #006600;">addChapter</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> TitleChapter<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		report.<span style="color: #006600;">addChapter</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> SmallChapter<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #000000; font-weight: bold;">return</span> report;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> IReport createFullReport<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		CustomReport report = <span style="color: #000000; font-weight: bold;">new</span> CustomReport<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		report.<span style="color: #006600;">addChapter</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> TitleChapter<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		report.<span style="color: #006600;">addChapter</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> IndexChapter<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		report.<span style="color: #006600;">addChapter</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ExtendedChapter<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #000000; font-weight: bold;">return</span> report;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TestApp.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factorymethod</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factorymethod.report.ReportCreator;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestApp <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">void</span> main<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> args<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		ReportCreator creator = <span style="color: #000000; font-weight: bold;">new</span> ReportCreator<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		creator.<span style="color: #006600;">createFullReport</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		creator.<span style="color: #006600;">createSummaryReport</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre>
<p>Результат работы программы:</p>
<pre>Title
Index
Extended

Title
Small</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-factory-metho/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Паттерн абстрактная фабрика (Abstract factory)</title>
		<link>http://sheremetov.com/oop/oop-pattern-factory/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-factory/#comments</comments>
		<pubDate>Sat, 08 May 2010 21:21:28 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=683</guid>
		<description><![CDATA[Сегодня мы рассмотрим паттерн абстрактная фабрика, или фабрика, как его часто называют. Этот паттерн относится к группе порождающих и решает проблему создания группы объектов. Классический пример использования фабрики для предоставления приложению элементов интерфейса в зависимости от платформы. Например, приложение на linux будет создавать при помощи фабрики кнопки, поля и прочие элементы через фабрику, которая в [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня мы рассмотрим паттерн абстрактная фабрика, или фабрика, как его часто называют. Этот паттерн относится к группе порождающих и решает проблему создания группы объектов. Классический пример использования фабрики для предоставления приложению элементов интерфейса в зависимости от платформы. Например, приложение на linux будет создавать при помощи фабрики кнопки, поля и прочие элементы через фабрику, которая в свою очередь, по запросу будет возвращать элементы XWindows, а приложение на windows будет возвращать элементы win32. Таким образом программе становится не важна платформа, платформо-зависимая логика ляжет на плечи фабрики.</p>
<p>Паттерн абстрактная фабрика должен использоваться тогда когда:</p>
<ul>
<li>Конкретный вариант требуемого поведения системы дают не отдельные объекты, а четко выраженное семейство связанных объектов</li>
<li>Объекты одного семейства должны использоваться вместе</li>
<li>Система должна кофигурироваться одним из семейств объектов</li>
</ul>
<p>Вот как это выглядит на диаграмме:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/05/abstract.gif"><img class="alignleft size-full wp-image-686" title="abstract" src="http://sheremetov.com/wp-content/uploads/2010/05/abstract.gif" alt="" width="437" height="471" /></a></p>
<p>В моем примере фабрики мы имеем три вида игровых юнитов Protos, Terran, Zerg (должно быть близко любому кто играл в StarCraft), и некоторое количество игровых юнитов (ботов). Боты создают солдатов нужного типа в зависимости от количества ресурсов добытых работягами, а также боты могут сражаться друг с другом теми юнитами, что были созданы.<br />
Вот код примера, несколько многословный, в силу специфичности синтаксиса явы:</p>
<pre class="java"><span style="color: #808080; font-style: italic;">// IUnit.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// CustomUnit.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CustomUnit <span style="color: #000000; font-weight: bold;">implements</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> toString<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;a:&quot;</span> + getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; g:&quot;</span> + getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; s:&quot;</span> + getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; p:&quot;</span> + getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ProtosSoldier.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProtosSoldier <span style="color: #000000; font-weight: bold;">extends</span> CustomUnit <span style="color: #000000; font-weight: bold;">implements</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">10</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">12</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">100</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">10</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Terransoldier.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TerranSoldier <span style="color: #000000; font-weight: bold;">extends</span> CustomUnit <span style="color: #000000; font-weight: bold;">implements</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">35</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">5</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">8</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">3</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ZergSoldier.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">unit</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ZergSoldier <span style="color: #000000; font-weight: bold;">extends</span> CustomUnit <span style="color: #000000; font-weight: bold;">implements</span> IUnit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAirWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">0</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">6</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPrice<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">25</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #cc66cc;">5</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// IArmyFactory.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">army</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IArmyFactory <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> IUnit createSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ProtosArmy.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">army</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
<span style="color: #a1a100;">import patterns.factory.unit.ProtosSoldier;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ProtosArmy <span style="color: #000000; font-weight: bold;">implements</span> IArmyFactory <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> IUnit createSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> ProtosSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TerranArmy.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">army</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
<span style="color: #a1a100;">import patterns.factory.unit.TerranSoldier;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TerranArmy <span style="color: #000000; font-weight: bold;">implements</span> IArmyFactory <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> IUnit createSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> TerranSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// ZergArmy.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">army</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
<span style="color: #a1a100;">import patterns.factory.unit.ZergSoldier;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ZergArmy <span style="color: #000000; font-weight: bold;">implements</span> IArmyFactory <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> IUnit createSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> ZergSoldier<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// BotClient.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>.<span style="color: #006600;">client</span>;
&nbsp;
<span style="color: #a1a100;">import java.util.ArrayList;</span>
<span style="color: #a1a100;">import java.util.Iterator;</span>
&nbsp;
<span style="color: #a1a100;">import patterns.factory.army.IArmyFactory;</span>
<span style="color: #a1a100;">import patterns.factory.unit.IUnit;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BotClient <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AArrayList+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">ArrayList</span></a> &lt;IUnit&gt; units;
	<span style="color: #000000; font-weight: bold;">private</span> IArmyFactory factory;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> BotClient<span style="color: #66cc66;">&#40;</span>IArmyFactory army<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		factory = army;
		units = <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AArrayList+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">ArrayList</span></a> &lt;IUnit&gt; <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> createForMoney<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> money<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ABoolean+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Boolean</span></a> hasMoney = <span style="color: #000000; font-weight: bold;">false</span>;
		units.<span style="color: #006600;">clear</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">do</span> <span style="color: #66cc66;">&#123;</span>
			IUnit unit = factory.<span style="color: #006600;">createSoldier</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			hasMoney = money - unit.<span style="color: #006600;">getPrice</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> &gt; <span style="color: #cc66cc;">0</span>;
			<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>hasMoney<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
				units.<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>;
				money -= unit.<span style="color: #006600;">getPrice</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">while</span><span style="color: #66cc66;">&#40;</span>hasMoney<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #993333;">int</span> total = <span style="color: #cc66cc;">0</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIterator+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Iterator</span></a>  iter = units.<span style="color: #006600;">iterator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	    <span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span>iter.<span style="color: #006600;">hasNext</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	    	total += <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>IUnit<span style="color: #66cc66;">&#41;</span>iter.<span style="color: #006600;">next</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getGroundWeapon</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	    <span style="color: #66cc66;">&#125;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> total;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #993333;">int</span> total = <span style="color: #cc66cc;">0</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AIterator+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Iterator</span></a>  iter = units.<span style="color: #006600;">iterator</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	    <span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span>iter.<span style="color: #006600;">hasNext</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
	    	total += <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>IUnit<span style="color: #66cc66;">&#41;</span>iter.<span style="color: #006600;">next</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getShield</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	    <span style="color: #66cc66;">&#125;</span>
	    <span style="color: #000000; font-weight: bold;">return</span> total;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> unitsCount<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> units.<span style="color: #006600;">size</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ABoolean+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Boolean</span></a> battle<span style="color: #66cc66;">&#40;</span>BotClient client<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Units: &quot;</span> + unitsCount<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; vs &quot;</span> + client.<span style="color: #006600;">unitsCount</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Attack: &quot;</span> + getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; vs &quot;</span> + client.<span style="color: #006600;">getGroundWeapon</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Shield: &quot;</span> + getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> + <span style="color: #ff0000;">&quot; vs &quot;</span> + client.<span style="color: #006600;">getShield</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #993333;">float</span> damage = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">float</span><span style="color: #66cc66;">&#41;</span>client.<span style="color: #006600;">getGroundWeapon</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> / <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">float</span><span style="color: #66cc66;">&#41;</span>getShield<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Damage: &quot;</span> + damage<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #993333;">float</span> enemyDamage = <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">float</span><span style="color: #66cc66;">&#41;</span>getGroundWeapon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> / <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">float</span><span style="color: #66cc66;">&#41;</span>client.<span style="color: #006600;">getShield</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Enemy damage: &quot;</span> + enemyDamage<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #000000; font-weight: bold;">return</span> enemyDamage &lt; damage;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TestApp.java</span>
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">factory</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.factory.army.ProtosArmy;</span>
<span style="color: #a1a100;">import patterns.factory.army.TerranArmy;</span>
<span style="color: #a1a100;">import patterns.factory.army.ZergArmy;</span>
<span style="color: #a1a100;">import patterns.factory.client.BotClient;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestApp <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">void</span> main<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> args<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		BotClient bot1 = <span style="color: #000000; font-weight: bold;">new</span> BotClient<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ProtosArmy<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		BotClient bot2 = <span style="color: #000000; font-weight: bold;">new</span> BotClient<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> TerranArmy<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		BotClient bot3 = <span style="color: #000000; font-weight: bold;">new</span> BotClient<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ZergArmy<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		bot1.<span style="color: #006600;">createForMoney</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span>;
		bot2.<span style="color: #006600;">createForMoney</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span>;
		bot3.<span style="color: #006600;">createForMoney</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>bot1.<span style="color: #006600;">battle</span><span style="color: #66cc66;">&#40;</span>bot2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>bot1.<span style="color: #006600;">battle</span><span style="color: #66cc66;">&#40;</span>bot3<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre>
<p>Результат работы примера:</p>
<pre>Units: 3 vs 11
Attack: 36 vs 88
Shield: 30 vs 33
Damage: 2.9333334
Enemy damage: 1.0909091
false
Units: 3 vs 15
Attack: 36 vs 90
Shield: 30 vs 75
Damage: 3.0
Enemy damage: 0.48
false</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-factory/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Строитель (Builder)</title>
		<link>http://sheremetov.com/oop/oop-pattern-builder/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-builder/#comments</comments>
		<pubDate>Mon, 03 May 2010 05:00:46 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[builder]]></category>
		<category><![CDATA[паттерны проектирования]]></category>
		<category><![CDATA[строитель]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=654</guid>
		<description><![CDATA[Предыдущий опыт показал что скриптовые языки не&#160;очень подходят для иллюстрации паттернов и&#160;дальше мы&#160;ограничились использованием ООП языков со&#160;строгой типизацией, так сказать, для большей наглядности. Сегодня речь пойдет о&#160;паттерне Строитель, предназначенного для конструирования объектов. Если процесс создания какого либо сложного объекта из&#160;составных имеет схожие этапы, имеет смысл описать единый алгоритм создания включающий в&#160;себя действия по&#160;созданию необходимого объекта. [...]]]></description>
			<content:encoded><![CDATA[<p>Предыдущий опыт показал что скриптовые языки не&nbsp;очень подходят для иллюстрации паттернов и&nbsp;дальше мы&nbsp;ограничились использованием ООП языков со&nbsp;строгой типизацией, так сказать, для большей наглядности.</p>
<p>Сегодня речь пойдет о&nbsp;паттерне Строитель, предназначенного для конструирования объектов.<br />
Если процесс создания какого либо сложного объекта из&nbsp;составных имеет схожие этапы, имеет смысл описать единый алгоритм создания включающий в&nbsp;себя действия по&nbsp;созданию необходимого объекта.</p>
<p>Вот как это выглядит в UML:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/05/builder.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/05/builder.gif" alt="builder" title="builder" width="424" height="179" class="alignleft size-full wp-image-676" /></a></p>
<p>В&nbsp;моем простом примере логика создания простой игровой карты выносится в&nbsp;класс строителя WorldBuilder, в&nbsp;котором реализовано два метода для создания пустого мира и&nbsp;со&nbsp;случайно расставленными стенами. </p>
<pre class="java">&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">// IPlace.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">builder</span>.<span style="color: #006600;">map</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IPlace <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// FloorPlace.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">builder</span>.<span style="color: #006600;">map</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> FloorPlace <span style="color: #000000; font-weight: bold;">implements</span> IPlace <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;.&quot;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// WallPlace.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">builder</span>.<span style="color: #006600;">map</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> WallPlace <span style="color: #000000; font-weight: bold;">implements</span> IPlace <span style="color: #66cc66;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;#&quot;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// World.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">builder</span>.<span style="color: #006600;">map</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> World <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> IPlace<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> places;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #993333;">int</span> WIDTH;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #993333;">int</span> HEIGHT;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> World<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> width, <span style="color: #993333;">int</span> height<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		WIDTH = width;
		HEIGHT = height;
		places = <span style="color: #000000; font-weight: bold;">new</span> IPlace<span style="color: #66cc66;">&#91;</span>WIDTH<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span>HEIGHT<span style="color: #66cc66;">&#93;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getWidth<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> WIDTH;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getHeight<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> HEIGHT;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> setPlace<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> x, <span style="color: #993333;">int</span> y, IPlace place<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		places<span style="color: #66cc66;">&#91;</span>x<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span>y<span style="color: #66cc66;">&#93;</span> = place;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> render<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> y = <span style="color: #cc66cc;">0</span>; y &lt; HEIGHT; y++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> x = <span style="color: #cc66cc;">0</span>; x &lt; WIDTH; x++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">print</span><span style="color: #66cc66;">&#40;</span>places<span style="color: #66cc66;">&#91;</span>x<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span>y<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// WorldBuilder.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">builder</span>.<span style="color: #006600;">map</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> WorldBuilder <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> World world;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> WorldBuilder<span style="color: #66cc66;">&#40;</span>World world<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">world</span> = world;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> createFloorAt<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> x, <span style="color: #993333;">int</span> y<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		world.<span style="color: #006600;">setPlace</span><span style="color: #66cc66;">&#40;</span>x, y, <span style="color: #000000; font-weight: bold;">new</span> FloorPlace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> createWallAt<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> x, <span style="color: #993333;">int</span> y<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		world.<span style="color: #006600;">setPlace</span><span style="color: #66cc66;">&#40;</span>x, y, <span style="color: #000000; font-weight: bold;">new</span> WallPlace<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> createEmptyWorld<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> y = <span style="color: #cc66cc;">0</span>; y &lt; world.<span style="color: #006600;">getHeight</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; y++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> x = <span style="color: #cc66cc;">0</span>; x &lt; world.<span style="color: #006600;">getWidth</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; x++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				createFloorAt<span style="color: #66cc66;">&#40;</span>x, y<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> createRandomWorld<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> emptynessRatio<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> y = <span style="color: #cc66cc;">0</span>; y &lt; world.<span style="color: #006600;">getHeight</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; y++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> x = <span style="color: #cc66cc;">0</span>; x &lt; world.<span style="color: #006600;">getWidth</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; x++<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Math</span></a>.<span style="color: #006600;">round</span><span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AMath+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">Math</span></a>.<span style="color: #006600;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> * <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span> &lt; emptynessRatio<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
					createFloorAt<span style="color: #66cc66;">&#40;</span>x, y<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
					createWallAt<span style="color: #66cc66;">&#40;</span>x, y<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TestApp.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">builder</span>;
&nbsp;
<span style="color: #a1a100;">import patterns.builder.map.World;</span>
<span style="color: #a1a100;">import patterns.builder.map.WorldBuilder;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestApp <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	 * @param args
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">void</span> main<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> args<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		World world = <span style="color: #000000; font-weight: bold;">new</span> World<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span>, <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span>;
		WorldBuilder builder = <span style="color: #000000; font-weight: bold;">new</span> WorldBuilder<span style="color: #66cc66;">&#40;</span>world<span style="color: #66cc66;">&#41;</span>;
		builder.<span style="color: #006600;">createEmptyWorld</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
                      world.<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		builder.<span style="color: #006600;">createRandomWorld</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">90</span><span style="color: #66cc66;">&#41;</span>;
		world.<span style="color: #006600;">render</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>А&nbsp;вот результат работы:</p>
</pre>
<pre>
....................
....................
....................
....................
....................

...##......#........
.#..................
.......#.......#....
.......#..#.....#...
..##....#.....#.....
</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-builder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Цепочка ответственности (Chain of Responsibility)</title>
		<link>http://sheremetov.com/oop/oop-pattern-chain-of-esponsibility/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-chain-of-esponsibility/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 05:00:20 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[паттерны проектирования]]></category>
		<category><![CDATA[цепочка ответственности]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=664</guid>
		<description><![CDATA[Еще один паттерн, из&#160;группы поведенческих,&#160;&#8212; цепочка ответственности (chain of&#160;responsibility). Цепочка обязанностей выстраивает объекты составных частей приложения связанными между собой по&#160;цепочке, для передачи запроса на&#160;обработку от&#160;более низких, детализированных слоев системы к&#160;более высоким глобальным. Вот UML диаграмма: Классический пример это контекстная справка в&#160;Microsoft Office, вы&#160;можете нажать кнопку вопросительного знака и&#160;кликнуть на&#160;любом элементе интерфейса, а&#160;система попытается найти страницу [...]]]></description>
			<content:encoded><![CDATA[<p>Еще один паттерн, из&nbsp;группы поведенческих,&nbsp;&mdash; цепочка ответственности (chain of&nbsp;responsibility).</p>
<p>Цепочка обязанностей выстраивает объекты составных частей приложения связанными между собой по&nbsp;цепочке, для передачи запроса на&nbsp;обработку от&nbsp;более низких, детализированных слоев системы к&nbsp;более высоким глобальным.</p>
<p>Вот UML диаграмма:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/04/chain.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/04/chain.gif" alt="chain" title="chain" width="433" height="165" class="alignleft size-full wp-image-681" /></a></p>
<p>Классический пример это контекстная справка в&nbsp;Microsoft Office, вы&nbsp;можете нажать кнопку вопросительного знака и&nbsp;кликнуть на&nbsp;любом элементе интерфейса, а&nbsp;система попытается найти страницу справки, максимально соответствующую запрошенному элементу. Делается это следующим образом,&nbsp;&mdash; поскольку интерфейс системы иерархичен, то&nbsp;запрс справки начинает подниматься снизу вверх&nbsp;&mdash; от&nbsp;элемента по&nbsp;которому был произведен клик вверх, первый элемент который &laquo;возьмется дать ответ&raquo;, и&nbsp;покажет справку.</p>
<p>В&nbsp;моем случае Цепочку Ответственности иллюстрирует класс игрового юнита, поведение к&nbsp;которому приближается вражеский ююнит, и&nbsp;в&nbsp;зависимости от&nbsp;игровой ситуации мы&nbsp;решаем как он&nbsp;поступит. Я&nbsp;определил несколько поведений: DefaultBehavoir (бызовый класс с&nbsp;общим функционалом), CarefulBehavoir (осторожность), AttackBehavoir (смелость), AngryBehavoir (злость). Мы&nbsp;можем выстроить иерархию поведения так как захотим (при этом верхнее поведение играет более важную роль при принятии решений).</p>
<p>Вот код примера:</p>
<pre class="java"><span style="color: #808080; font-style: italic;">// IBehavoir.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">chain</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IBehavoir <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> handle<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> distance, <span style="color: #993333;">int</span> power<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// DefaultBehavoir.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">chain</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> DefaultBehavoir <span style="color: #000000; font-weight: bold;">implements</span> IBehavoir <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> WAIT = <span style="color: #cc66cc;">0</span>;
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> ATTACK = <span style="color: #cc66cc;">1</span>;
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> RUN = <span style="color: #cc66cc;">2</span>;
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> DefaultBehavoir behavoir;
	<span style="color: #000000; font-weight: bold;">protected</span> Unit unit;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> DefaultBehavoir<span style="color: #66cc66;">&#40;</span>Unit unit<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">unit</span> = unit;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> handle<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> distance, <span style="color: #993333;">int</span> power<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>behavoir != <span style="color: #000000; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> behavoir.<span style="color: #006600;">handle</span><span style="color: #66cc66;">&#40;</span>distance, power<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;DefaultBehavoir::handle()&quot;</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #000000; font-weight: bold;">return</span> DefaultBehavoir.<span style="color: #006600;">WAIT</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> DefaultBehavoir addBehavoir<span style="color: #66cc66;">&#40;</span>DefaultBehavoir behavoir<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">behavoir</span> = behavoir;
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">this</span>;
	<span style="color: #66cc66;">&#125;</span>	
&nbsp;
	<span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a> getCode<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> option<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100;">switch</span><span style="color: #66cc66;">&#40;</span>option<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">1</span>:
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;attack!!!&quot;</span>;
			<span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">2</span>:
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;run!&quot;</span>;
			<span style="color: #000000; font-weight: bold;">default</span>:
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #ff0000;">&quot;waiting...&quot;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// CarefulBehavoir.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">chain</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> CarefulBehavoir <span style="color: #000000; font-weight: bold;">extends</span> DefaultBehavoir <span style="color: #000000; font-weight: bold;">implements</span> IBehavoir <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> CarefulBehavoir<span style="color: #66cc66;">&#40;</span>Unit unit<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span><span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> handle<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> distance, <span style="color: #993333;">int</span> power<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;CarefulBehavoir::handle()&quot;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>power &lt; unit.<span style="color: #006600;">getPower</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>distance &lt; unit.<span style="color: #006600;">getAttackDistance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> DefaultBehavoir.<span style="color: #006600;">ATTACK</span>;
			<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> DefaultBehavoir.<span style="color: #006600;">WAIT</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>distance + <span style="color: #cc66cc;">2</span> &lt; unit.<span style="color: #006600;">getAttackDistance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #66cc66;">&#40;</span>power &gt; unit.<span style="color: #006600;">getPower</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> DefaultBehavoir.<span style="color: #006600;">RUN</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006600;">handle</span><span style="color: #66cc66;">&#40;</span>distance, power<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>	
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// AttackBehavoir.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">chain</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AttackBehavoir <span style="color: #000000; font-weight: bold;">extends</span> DefaultBehavoir <span style="color: #000000; font-weight: bold;">implements</span> IBehavoir <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> AttackBehavoir<span style="color: #66cc66;">&#40;</span>Unit unit<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span><span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> handle<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> distance, <span style="color: #993333;">int</span> power<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;AttackBehavoir::handle()&quot;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>distance &lt; unit.<span style="color: #006600;">getAttackDistance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #66cc66;">&#40;</span>power &lt; unit.<span style="color: #006600;">getPower</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> DefaultBehavoir.<span style="color: #006600;">ATTACK</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006600;">handle</span><span style="color: #66cc66;">&#40;</span>distance, power<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// AngryBehavoir.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">chain</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> AngryBehavoir <span style="color: #000000; font-weight: bold;">extends</span> DefaultBehavoir <span style="color: #000000; font-weight: bold;">implements</span> IBehavoir <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> AngryBehavoir<span style="color: #66cc66;">&#40;</span>Unit unit<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">super</span><span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> handle<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> distance, <span style="color: #993333;">int</span> power<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;AngryBehavoir::handle()&quot;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>distance / <span style="color: #cc66cc;">2</span> &lt; unit.<span style="color: #006600;">getAttackDistance</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &amp;&amp; <span style="color: #66cc66;">&#40;</span>power / <span style="color: #cc66cc;">5</span> &lt; unit.<span style="color: #006600;">getPower</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">return</span> DefaultBehavoir.<span style="color: #006600;">ATTACK</span>;
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006600;">handle</span><span style="color: #66cc66;">&#40;</span>distance, power<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// Unit.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">chain</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Unit <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #993333;">int</span> power;
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #993333;">int</span> attackDistance;
	<span style="color: #000000; font-weight: bold;">private</span> DefaultBehavoir behavoir;
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> Unit<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> power, <span style="color: #993333;">int</span> attackDistance<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">power</span> = power;
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">attackDistance</span> = attackDistance;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getPower<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> power;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> getAttackDistance<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> attackDistance;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #993333;">void</span> setBehavoir<span style="color: #66cc66;">&#40;</span>DefaultBehavoir behavoir<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">behavoir</span> = behavoir;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">protected</span> DefaultBehavoir getBehavoir<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> behavoir;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">int</span> processSituation<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> distance, <span style="color: #993333;">int</span> power<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> behavoir.<span style="color: #006600;">handle</span><span style="color: #66cc66;">&#40;</span>distance, power<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>	
&nbsp;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">// TestApp.java</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">package</span> patterns.<span style="color: #006600;">chain</span>;
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestApp <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/**
	 * @param args
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #993333;">void</span> main<span style="color: #66cc66;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">String</span></a><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> args<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		Unit unit = <span style="color: #000000; font-weight: bold;">new</span> Unit<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span>,<span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span>;
		unit.<span style="color: #006600;">setBehavoir</span><span style="color: #66cc66;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> CarefulBehavoir<span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">addBehavoir</span><span style="color: #66cc66;">&#40;</span>
				<span style="color: #000000; font-weight: bold;">new</span> AttackBehavoir<span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">addBehavoir</span><span style="color: #66cc66;">&#40;</span>
					<span style="color: #000000; font-weight: bold;">new</span> DefaultBehavoir<span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>
				<span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>DefaultBehavoir.<span style="color: #006600;">getCode</span><span style="color: #66cc66;">&#40;</span>unit.<span style="color: #006600;">processSituation</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>DefaultBehavoir.<span style="color: #006600;">getCode</span><span style="color: #66cc66;">&#40;</span>unit.<span style="color: #006600;">processSituation</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">5</span>,<span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>DefaultBehavoir.<span style="color: #006600;">getCode</span><span style="color: #66cc66;">&#40;</span>unit.<span style="color: #006600;">processSituation</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span>,<span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
		unit.<span style="color: #006600;">setBehavoir</span><span style="color: #66cc66;">&#40;</span>
			<span style="color: #000000; font-weight: bold;">new</span> AngryBehavoir<span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">addBehavoir</span><span style="color: #66cc66;">&#40;</span>
				<span style="color: #000000; font-weight: bold;">new</span> CarefulBehavoir<span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">addBehavoir</span><span style="color: #66cc66;">&#40;</span>
					<span style="color: #000000; font-weight: bold;">new</span> DefaultBehavoir<span style="color: #66cc66;">&#40;</span>unit<span style="color: #66cc66;">&#41;</span>
				<span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#41;</span>;
&nbsp;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>DefaultBehavoir.<span style="color: #006600;">getCode</span><span style="color: #66cc66;">&#40;</span>unit.<span style="color: #006600;">processSituation</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>DefaultBehavoir.<span style="color: #006600;">getCode</span><span style="color: #66cc66;">&#40;</span>unit.<span style="color: #006600;">processSituation</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">7</span>,<span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #aaaadd; font-weight: bold;">System</span></a>.<span style="color: #006600;">out</span>.<span style="color: #006600;">println</span><span style="color: #66cc66;">&#40;</span>DefaultBehavoir.<span style="color: #006600;">getCode</span><span style="color: #66cc66;">&#40;</span>unit.<span style="color: #006600;">processSituation</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span>,<span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre>
<p>Вот результат работы программы:</p>
<pre>CarefulBehavoir::handle()
attack!!!
CarefulBehavoir::handle()
run!
CarefulBehavoir::handle()
AttackBehavoir::handle()
DefaultBehavoir::handle()
waiting...
AngryBehavoir::handle()
attack!!!
AngryBehavoir::handle()
attack!!!
AngryBehavoir::handle()
CarefulBehavoir::handle()
DefaultBehavoir::handle()
waiting...</pre>
<p>Видно как злость влияет на&nbsp;принятие благоразумных решений.<br />
Пример, к&nbsp;сожалению, далек от&nbsp;совершенства&nbsp;но, надеюсь, общую идею иллюстрирует.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-chain-of-esponsibility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Прокси (proxy)</title>
		<link>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2-3/</link>
		<comments>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2-3/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 05:58:17 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[паттерн]]></category>
		<category><![CDATA[прокси]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=621</guid>
		<description><![CDATA[Последний паттерн из группы структурных, — Прокси. Его назначение в том, что бы добавлять дополнительный слой функциональности между клиентом и подсистемой (субъектом). В такой, казалось бы избыточной работе есть масса смысла и пользы, приведу несколько примеров когда это оправдано: субъект находится на другой машине и Прокси скрывает протокол доступа, при обращениях создает экземпляр субъекта, только когда это действительно надо, кеширует результаты. может контролировать права доступа [...]]]></description>
			<content:encoded><![CDATA[<p>Последний паттерн из группы структурных, — Прокси. Его назначение в том, что бы добавлять дополнительный слой функциональности между клиентом и подсистемой (субъектом). В такой, казалось бы избыточной работе есть масса смысла и пользы, приведу несколько примеров когда это оправдано:</p>
<ul>
<li>субъект находится на другой машине и Прокси скрывает протокол доступа, при обращениях</li>
<li>создает экземпляр субъекта, только когда это действительно надо, кеширует результаты.</li>
<li>может контролировать права доступа при вызовах</li>
<li>производит синхронные вызовы в асинхронной среде</li>
</ul>
<p>На диаграмме прокси выглядит так:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/proxy.gif"><img class="alignnone size-full wp-image-622" title="proxy" src="http://sheremetov.com/wp-content/uploads/2010/03/proxy.gif" alt="proxy" width="405" height="252" /></a></p>
<p>Короткий пример Прокси:</p>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">class</span> XMPPRequest<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, connect<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, to, text<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> XmppProxy<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, who, to, text<span style="color: black;">&#41;</span>:
        xmpp = XMPPRequest<span style="color: black;">&#40;</span>who<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> xmpp.<span style="color: black;">send</span><span style="color: black;">&#40;</span>to, text<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    proxy = XmppProxy<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>proxy.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;mrjazz&quot;</span>, <span style="color: #483d8b;">&quot;team&quot;</span>, <span style="color: #483d8b;">&quot;hi all&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Приспособленец (flyweight)</title>
		<link>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2-2/</link>
		<comments>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2-2/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 05:53:03 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[паттерн]]></category>
		<category><![CDATA[приспособленец]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=612</guid>
		<description><![CDATA[Следующий паттерн,&#160;&#8212; Приспособленец. Приспособленцы моделируют сущности, число которых слишком велико для представления объектами. В&#160;моем примере это отрисовка игровой карты (или участка карты). Например ваша карта состоит из&#160;плиток пола и&#160;стен, но&#160;по&#160;разному отрисовываются, с&#160;учетом света, времени суток, и&#160;других факторов. Создавать для каждого сегмента карты отдельный экземпляр,&#160;&#8212; слишком большая роскошь. Поэтому мы&#160;создаем по&#160;одному экземпляру каждого типа и&#160;с&#160;их&#160;помощью отрисовываем [...]]]></description>
			<content:encoded><![CDATA[<p>Следующий паттерн,&nbsp;&mdash; Приспособленец. Приспособленцы моделируют сущности, число которых слишком велико для представления объектами. В&nbsp;моем примере это отрисовка игровой карты (или участка карты). Например ваша карта состоит из&nbsp;плиток пола и&nbsp;стен, но&nbsp;по&nbsp;разному отрисовываются, с&nbsp;учетом света, времени суток, и&nbsp;других факторов. Создавать для каждого сегмента карты отдельный экземпляр,&nbsp;&mdash; слишком большая роскошь. Поэтому мы&nbsp;создаем по&nbsp;одному экземпляру каждого типа и&nbsp;с&nbsp;их&nbsp;помощью отрисовываем всю карту.</p>
<p>На&nbsp;диаграмме Приспособленец, выглядит следующим образом:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/flyweight.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/03/flyweight.gif" alt="flyweight" title="flyweight" width="467" height="289" class="alignnone size-full wp-image-613" /></a></p>
<p>Имеет использовать Приспособленца если одновременно выполняются следующие условия: </p>
<ul>
<li>в приложении используется большое число обьектов, из-за этого высоки расходы на&nbsp;хранение </li>
<li>большую часть состояния обьектов можно вынести из&nbsp;объекта Приспособленца</li>
</ul>
<p>Код примера:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Wall:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> draw<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;#&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Floor:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> draw<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;.&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> MapFactory:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">classes</span> = <span style="color: black;">&#40;</span>Floor<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, Wall<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getMapClassByNum<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, num<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">classes</span><span style="color: black;">&#91;</span>num<span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    <span style="color: #008000;">map</span> = <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;
111101111111
100000000001
100011110011
101000010001
111111111101&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    factory = MapFactory<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">map</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> line:
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>factory.<span style="color: black;">getMapClassByNum</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">draw</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
--------------------------------
&nbsp;
<span style="color: #808080; font-style: italic;"># # # # . # # # # # # #</span>
<span style="color: #808080; font-style: italic;"># . . . . . . . . . . #</span>
<span style="color: #808080; font-style: italic;"># . . . # # # # . . # #</span>
<span style="color: #808080; font-style: italic;"># . # . . . . # . . . #</span>
<span style="color: #808080; font-style: italic;"># # # # # # # # # # . #</span>
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Фасад (facade)</title>
		<link>http://sheremetov.com/oop/oop-pattern-facade/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-facade/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 05:22:57 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[motivation]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[паттерн]]></category>
		<category><![CDATA[фасад]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=607</guid>
		<description><![CDATA[Еще один паттерн из группы структурирующих, - фасад. Фасад предоставляет унифицированный интерфейс, "оборачивая" собой подсистему. Им пользуются в случае если необходимо изолировать клиента от "разухабистого" API подсистемы, упрощая его и сокращая количество объектов о которых должен знать клиент. Фасад может упростить переносимость кода между разными платформами или подсистемами. Вот как выглядит Фасад на диаграмме: Простой [...]]]></description>
			<content:encoded><![CDATA[<p>Еще один паттерн из группы структурирующих, - фасад. Фасад предоставляет унифицированный интерфейс, "оборачивая" собой подсистему. Им пользуются в случае если необходимо изолировать клиента от "разухабистого" API подсистемы, упрощая его и сокращая количество объектов о которых должен знать клиент. Фасад может упростить переносимость кода между разными платформами или подсистемами.</p>
<p>Вот как выглядит Фасад на диаграмме:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/04/facade.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/04/facade.gif" alt="facade" title="facade" width="380" height="272" class="alignnone size-full wp-image-610" /></a></p>
<p>Простой пример, реализующий Фасад на Python:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Tree:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> grow<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;grow tree&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Child:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> born<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;born child&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> House:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> build<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;build house&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TheMenFacade:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._tree = Tree<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>._child = Child<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>._house = House<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> growTree<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._tree.<span style="color: black;">grow</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> bornChild<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._child.<span style="color: black;">born</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> buildHouse<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>._house.<span style="color: black;">build</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Content-Type: text/plain'</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">''</span>    
&nbsp;
    facade = TheMenFacade<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    facade.<span style="color: black;">bornChild</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    facade.<span style="color: black;">buildHouse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    facade.<span style="color: black;">growTree</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
--------------
&nbsp;
born child
build house
grow tree
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-facade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Декоратор (decorator)</title>
		<link>http://sheremetov.com/oop/oop-pattern-decorato/</link>
		<comments>http://sheremetov.com/oop/oop-pattern-decorato/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 05:48:26 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[декоратор]]></category>
		<category><![CDATA[паттерн]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=603</guid>
		<description><![CDATA[Еще один паттерн из&#160;группы структурирующих,&#160;&#8212; декоратор. Его назначение в&#160;том чтобы возложить дополнительные обязанности (прозрачные для клиентов) на&#160;отдельный объект, а&#160;не&#160;на&#160;класс в&#160;целом. Функциональность обязанностей реализуется в&#160;небольших объектах. Преимущество состоит в&#160;возможности динамически добавлять эту функциональность до&#160;или после основной функциональности объекта ConcreteComponent. Декоратор позволяет разгрузить приложение от&#160;классов с&#160;похожей функциональностью. Классический пример Декоратора,&#160;&#8212; это какой-нибудь класс, рисующий прямоугольник, с&#160;добавлением декораторов, [...]]]></description>
			<content:encoded><![CDATA[<p>Еще один паттерн из&nbsp;группы структурирующих,&nbsp;&mdash; декоратор. Его назначение в&nbsp;том чтобы возложить дополнительные обязанности (прозрачные для клиентов) на&nbsp;отдельный объект, а&nbsp;не&nbsp;на&nbsp;класс в&nbsp;целом. Функциональность обязанностей реализуется в&nbsp;небольших объектах. Преимущество состоит в&nbsp;возможности динамически добавлять эту функциональность до&nbsp;или после основной функциональности объекта ConcreteComponent. Декоратор позволяет разгрузить приложение от&nbsp;классов с&nbsp;похожей функциональностью. </p>
<p>Классический пример Декоратора,&nbsp;&mdash; это какой-нибудь класс, рисующий прямоугольник, с&nbsp;добавлением декораторов, которые рисуют рамки, заливают цветом или изображением. Причем, применение декоратора, рисующего рамку дважды, нарисует двойную рамку.</p>
<p>На&nbsp;диаграмме Декоратор выглядит так:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/decorator.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/03/decorator.gif" alt="decorator" title="decorator" width="431" height="356" class="alignnone size-full wp-image-604" /></a></p>
<p>Пример реализации паттерна Декоратор:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> BaseModel<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span> = <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;speakers&quot;</span>:<span style="color: #ff4500;">4</span>, <span style="color: #483d8b;">&quot;airbag&quot;</span>: <span style="color: #ff4500;">1</span>, <span style="color: #483d8b;">&quot;engine&quot;</span>: <span style="color: #483d8b;">&quot;1.2L&quot;</span><span style="color: black;">&#125;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getPrice<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">12000</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> AmbientModel<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, model<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">price</span> = model.<span style="color: black;">getPrice</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">2200</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span> = model.<span style="color: black;">features</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;airbag&quot;</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">2</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;speakers&quot;</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">6</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span>.<span style="color: black;">setdefault</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ligh&quot;</span>, <span style="color: #483d8b;">&quot;halogen&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getPrice<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">price</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> SportModel<span style="color: black;">&#40;</span>BaseModel<span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, model<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">price</span> = model.<span style="color: black;">getPrice</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">3800</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span> = model.<span style="color: black;">features</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;airbag&quot;</span><span style="color: black;">&#93;</span> = <span style="color: #ff4500;">4</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">&quot;engine&quot;</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">&quot;1.6L&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getPrice<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">price</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Auto:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, model<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">model</span> = model
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> specification<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">model</span>.<span style="color: black;">features</span>.<span style="color: black;">keys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%-10s: %s&quot;</span> % <span style="color: black;">&#40;</span>i, <span style="color: #008000;">self</span>.<span style="color: black;">model</span>.<span style="color: black;">features</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;price     : %d&quot;</span><span style="color: black;">&#41;</span> % <span style="color: #008000;">self</span>.<span style="color: black;">model</span>.<span style="color: black;">getPrice</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    model = BaseModel<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    model = AmbientModel<span style="color: black;">&#40;</span>model<span style="color: black;">&#41;</span>
    model = SportModel<span style="color: black;">&#40;</span>model<span style="color: black;">&#41;</span>
    auto = Auto<span style="color: black;">&#40;</span>model<span style="color: black;">&#41;</span>
    auto.<span style="color: black;">specification</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
-------------------
&nbsp;
airbag    : <span style="color: #ff4500;">4</span>
engine    : <span style="color: #ff4500;">1</span>.6L
speakers  : <span style="color: #ff4500;">6</span>
ligh      : halogen
price     : <span style="color: #ff4500;">18000</span>
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/oop-pattern-decorato/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ООП для чайников. Паттерны проектирования. Компоновщик (composite)</title>
		<link>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2/</link>
		<comments>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 05:18:23 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[oop]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[компоновщик]]></category>
		<category><![CDATA[паттерн]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=593</guid>
		<description><![CDATA[Следующий паттерн, - компоновщик (composite), тоже из группы структурирующих. Компоновщик организует объекты в древовидные структуры для представления иерархии часть-целое. Всевозможные иерархии деревьев страниц в каталогах, файлов в папках являются яркими представителями паттерна Компоновщик. Диаграмма для Компоновщика, выглядит так: Реализовывая Компоновщик, нужно помнить о том чтобы интерфейс Component был максимально дополнен используемыми публичными методами, избавляя клиента [...]]]></description>
			<content:encoded><![CDATA[<p>Следующий паттерн, - компоновщик (composite), тоже из группы структурирующих.</p>
<p>Компоновщик организует объекты в древовидные структуры для представления иерархии часть-целое. Всевозможные иерархии деревьев страниц в каталогах, файлов в папках являются яркими представителями паттерна Компоновщик. </p>
<p>Диаграмма для Компоновщика, выглядит так:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/03/composite.gif"><img src="http://sheremetov.com/wp-content/uploads/2010/03/composite.gif" alt="composite" title="composite" width="449" height="325" class="alignnone size-full wp-image-596" /></a></p>
<p>Реализовывая Компоновщик, нужно помнить о том чтобы интерфейс Component был максимально дополнен используемыми публичными методами, избавляя клиента от приведения к типу или проверки существования метода (в случае скриптовых языков). Также? стоит сразу позаботиться о максимально удобном функционале для управления элементами (помимо стандартных Add, Remove, GetChildIn).</p>
<p>Пример реализации на Python:</p>
<pre class="python">&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TreeItem:
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, name<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">items</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">name</span> = name
        <span style="color: #008000;">self</span>.<span style="color: black;">current</span> = <span style="color: #ff4500;">0</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__iter__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> add<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, item<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">items</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> item
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> remove<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, name<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">items</span> = <span style="color: black;">&#91;</span>i <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">items</span> <span style="color: #ff7700;font-weight:bold;">if</span> i.<span style="color: black;">name</span> != name<span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__len__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">items</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, i<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">items</span><span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> next<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">current</span> += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">items</span><span style="color: black;">&#41;</span> &gt;= <span style="color: #008000;">self</span>.<span style="color: black;">current</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">items</span><span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">current</span><span style="color: #ff4500;">-1</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">StopIteration</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    root = TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span>
    root.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder1&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">print</span> root.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>.<span style="color: black;">name</span>
    root.<span style="color: black;">remove</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder1&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
    root.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder2&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder21&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    root.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder3&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder31&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">add</span><span style="color: black;">&#40;</span>TreeItem<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;folder311&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> walk<span style="color: black;">&#40;</span>item, level<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>level<span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span>,
        <span style="color: #ff7700;font-weight:bold;">print</span><span style="color: black;">&#40;</span>item.<span style="color: black;">name</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> item:
            walk<span style="color: black;">&#40;</span>i, level + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
    walk<span style="color: black;">&#40;</span>root, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
-----------------------------
folder1
/
  folder2
    folder21
  folder3
    folder311
&nbsp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/oop/%d0%be%d0%be%d0%bf-%d0%b4%d0%bb%d1%8f-%d1%87%d0%b0%d0%b9%d0%bd%d0%b8%d0%ba%d0%be%d0%b2-%d0%bf%d0%b0%d1%82%d1%82%d0%b5%d1%80%d0%bd%d1%8b-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

