<?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>В поисках успеха</title>
	<atom:link href="http://sheremetov.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://sheremetov.com</link>
	<description>Блог оптимистичного менеджера проектов</description>
	<lastBuildDate>Sun, 22 Aug 2010 06:53:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Дайджест ссылок №13</title>
		<link>http://sheremetov.com/links/links-13/</link>
		<comments>http://sheremetov.com/links/links-13/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 06:53:15 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[ссылки]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=774</guid>
		<description><![CDATA[
Несколько примеров применения Adobe AIR с&#160;кодом (Пример реализации сокет-сервера на&#160;AIR, множество примеров AIR приложений: FileTile (работа с&#160;файлами), GeoTest (работа с&#160;мультитач), Lineup (интеграция календаря с&#160;Exchange), Microphone (запись с&#160;микрофона локально и&#160;воспроизведение), S3E (работа с&#160;Amazon&#8217;s S3))
Порт quake на&#160;ActionScript. Судя по&#160;этой демке, большинство флеш программистов просто не&#160;умеют его готовить.
Увидев этот дизайн просто не&#160;смог удержиться чтобы не&#160;написать про него. По&#160;функционалу [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://www.adobe.com/devnet/air/flex/samples.html">Несколько примеров применения Adobe AIR с&nbsp;кодом</a> (Пример реализации сокет-сервера на&nbsp;AIR, множество примеров AIR приложений: FileTile (работа с&nbsp;файлами), GeoTest (работа с&nbsp;мультитач), Lineup (интеграция календаря с&nbsp;Exchange), Microphone (запись с&nbsp;микрофона локально и&nbsp;воспроизведение), S3E (работа с&nbsp;Amazon&rsquo;s S3))</li>
<li><a href="http://www.kongregate.com/games/Lycius/quake-1">Порт quake на&nbsp;ActionScript</a>. Судя по&nbsp;этой демке, большинство флеш программистов просто не&nbsp;умеют его готовить.</li>
<li>Увидев <a href="wwws.mint.com">этот дизайн</a> просто не&nbsp;смог удержиться чтобы не&nbsp;написать про него. По&nbsp;функционалу это похоже на&nbsp;проект <a href="http://www.kraynov.com/">Макса Крайнова</a> <a href="http://www.4konverta.com/">4konverta</a>, с&nbsp;большим упором на&nbsp;анализ своих трат с&nbsp;кредитной карты или банковского счета, но&nbsp;дизайн этого сервиса ставит его в&nbsp;стороне от&nbsp;множества аналогичных стартапов. Просто зайдите и&nbsp;посмотрите какими могут быть сайты финансового учета.</li>
<li>Наконец-то <a href="http://www.flashrealtime.com/screen-sharing-in-flash-now-available/">стало возможным вещать свой экран</a> (screen share) без хаков и&nbsp;дополнительных костылей. Ну, или почти без костылей. Только с&nbsp;одним костылем&nbsp;&mdash; LCCS (LiveCycle Collaboration Service).</li>
<li><a href="http://kodos.sourceforge.net/">kodos</a>&nbsp;&mdash; шикарнейший инструмент для работы с&nbsp;регулярными выражениями в&nbsp;питоне: обработка выражений &laquo;на&nbsp;лету&raquo;, генерация кода, подсказки по&nbsp;синтаксису. Очень рекомендую попробовать.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/links/links-13/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Дайджест ссылок №12</title>
		<link>http://sheremetov.com/uncategorized/%d0%b4%d0%b0%d0%b9%d0%b4%d0%b6%d0%b5%d1%81%d1%82-%d1%81%d1%81%d1%8b%d0%bb%d0%be%d0%ba-%e2%84%9612/</link>
		<comments>http://sheremetov.com/uncategorized/%d0%b4%d0%b0%d0%b9%d0%b4%d0%b6%d0%b5%d1%81%d1%82-%d1%81%d1%81%d1%8b%d0%bb%d0%be%d0%ba-%e2%84%9612/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 05:10:22 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=768</guid>
		<description><![CDATA[Давно не писал. Попробую восполнить пробел набором ссылок, которые считаю стоящими:

Подборка ссылок на прошлогодние мысли Макса Крайнова. Что самое интересное, по прежнему не утратившие своей актуальности и полезности.
Один и второй выпуски подкаста «The Art Of Programming» с участием Константина Ковалева, в которых он, своим трезвым и рассудительным взглядом, смотрит на платформу Adobe Flash, её прошлое, настоящее и будущее.
Несколько ссылок для тех кто посматривает в сторону mercurial в качестве системы контроля версий: [...]]]></description>
			<content:encoded><![CDATA[<p>Давно не писал. Попробую восполнить пробел набором ссылок, которые считаю стоящими:</p>
<ul>
<li><a href="http://www.kraynov.com/2010/07/27/a-year-ago-30-2/">Подборка ссылок</a> на прошлогодние мысли <a href="http://www.kraynov.com/">Макса Крайнова</a>. Что самое интересное, по прежнему не утратившие своей актуальности и полезности.</li>
<li><a href="http://taop.rpod.ru/164735.html">Один</a> и <a href="http://taop.rpod.ru/163710.html">второй</a> выпуски подкаста «The Art Of Programming» с участием Константина Ковалева, в которых он, своим трезвым и рассудительным взглядом, смотрит на платформу Adobe Flash, её прошлое, настоящее и будущее.</li>
<li>Несколько ссылок для тех кто посматривает в сторону <a href="http://mercurial.selenic.com/">mercurial</a> в качестве системы контроля версий: <a href="http://www.ivy.fr/mercurial/ref/v1.0/">набор шпаргалок</a>, красиво иллюстрированное <a href="http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/">введение в распределенные системы хранения версий</a> на примере mercurial и <a href="http://hginit.com/">качественный сайт про переход на mercurial</a> от самого Джоэля Спольски.</li>
<li><a href="http://thetorch.ru/?p=128">Хорошая статейка</a> о распространенной проблеме управления в наших гос учереждениях. К счастью в IT встречается не так часто, но знать об этом, безусловно надо.</li>
<li>В <a href="http://facebook.com">facebook</a> появилось <a href="http://apps.facebook.com/cubebuilder/">приложение от adobe</a> с помощью которого, можно с удовольствием проверить свой уровень знаний по Flex</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/uncategorized/%d0%b4%d0%b0%d0%b9%d0%b4%d0%b6%d0%b5%d1%81%d1%82-%d1%81%d1%81%d1%8b%d0%bb%d0%be%d0%ba-%e2%84%9612/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Перевод документации к PureMVC</title>
		<link>http://sheremetov.com/flash/puremvc-translation/</link>
		<comments>http://sheremetov.com/flash/puremvc-translation/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 18:10:18 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[translation]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=760</guid>
		<description><![CDATA[Какое-то время тому назад, мы с группой энтузиастов:

Романом Павленко
Денисом “Barmaleychik” Волохом
Дмитрием “Reijii” Кочетовым
Ростиславом “RostislavR” Сирыком

cделали перевод документации к PureMVC а Клифф Холл опубликовал.

Со временем в переводе было найдено массу огрехов, благодаря читателям flash-ripper.com но обновленный документ развалил нам структуру вордовского документа, который Клифф использует для конвертации документации в pdf, и окончательно опустив руки в борьбе [...]]]></description>
			<content:encoded><![CDATA[<p>Какое-то время тому назад, мы с группой энтузиастов:</p>
<ul>
<li>Романом Павленко</li>
<li><a href="http://denisvolokh.blogspot.com/">Денисом “Barmaleychik” Волохом</a></li>
<li><a href="http://reijii.solartxit.com/">Дмитрием “Reijii” Кочетовым</a></li>
<li><a href="http://flash-ripper.com/">Ростиславом “RostislavR” Сирыком</a></li>
</ul>
<p>cделали перевод документации к <a href="http://puremvc.org/">PureMVC</a> а Клифф Холл опубликовал.
</p>
<p>Со временем в переводе было найдено массу огрехов, благодаря читателям <a href="http://flash-ripper.com/">flash-ripper.com</a> но обновленный документ развалил нам структуру вордовского документа, который Клифф использует для конвертации документации в pdf, и окончательно опустив руки в борьбе с Microsoft Word исправленный перевод был закинут в долгий ящик. Недавно, разгребая завалы неоконченных дел, я нашел этот документ и решил опубликовать его хотя бы в блоге, - надеюсь ищущие найдут его тут. </p>
<p>Перевод не ограничен действиями лицензий - вы можете печатать его, давать почитать друзьям, изменять его как вам заблагорассудится и даже продавать. Прочитать его можно <a href="http://sheremetov.com/puremvc">тут</a></p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/flash/puremvc-translation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Невозможно научиться делать роскошные интерфейсы,  если вы&#8230;</title>
		<link>http://sheremetov.com/books/ui-book/</link>
		<comments>http://sheremetov.com/books/ui-book/#comments</comments>
		<pubDate>Tue, 25 May 2010 20:06:07 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[books]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=740</guid>
		<description><![CDATA[Последняя прочитанная мною книга была книга Влада В. Головача &#171;Дизайн пользовательского интерфейса2 Искусство мыть слона&#187;. Сказать что она мне понравилась&#160;&#8212; это ничего не&#160;сказать. Во-первых, это лаконичный и&#160;содержательный материал, насыщенный примерами из&#160;богатого опыта автора. Во-вторых это умозаключения и&#160;выводы, которыми автор делится с&#160;читателем, и&#160;с&#160;позицией которого, я&#160;на&#160;сто процентов солидарен. Эту книгу, я&#160;советую каждому, кто в&#160;силу своей профессиональной деятельности, [...]]]></description>
			<content:encoded><![CDATA[<p>Последняя прочитанная мною книга была книга Влада В. Головача <a href="http://uibook2.usethics.ru/">&laquo;Дизайн пользовательского интерфейса<sup>2</sup> Искусство мыть слона&raquo;</a>. Сказать что она мне понравилась&nbsp;&mdash; это ничего не&nbsp;сказать. Во-первых, это лаконичный и&nbsp;содержательный материал, насыщенный примерами из&nbsp;богатого опыта автора. Во-вторых это умозаключения и&nbsp;выводы, которыми автор делится с&nbsp;читателем, и&nbsp;с&nbsp;позицией которого, я&nbsp;на&nbsp;сто процентов солидарен. Эту книгу, я&nbsp;советую каждому, кто в&nbsp;силу своей профессиональной деятельности, связан с&nbsp;проектированием пользовательских интерфейсов.</p>
<p>К&nbsp;сожалению&nbsp;то, что является неотьемлемой частью успеха любого информационного продукта, а&nbsp;программное обеспечение, именно таковым и&nbsp;является, зачастую выпускается из&nbsp;виду программистами и&nbsp;дизайнерами,&nbsp;&mdash; дизайнерами, в&nbsp;силу стремления к&nbsp;&laquo;вау-фактору&raquo; и&nbsp;&laquo;фишкам&raquo;, программистами, в&nbsp;силу сфокусированности на&nbsp;том как продукт работает а&nbsp;не&nbsp;как им&nbsp;пользуется конечный пользователь. Я&nbsp;говорю именно о&nbsp;искусстве разрабатывать удобные и&nbsp;понятные продукты, собственно&nbsp;то, что и&nbsp;является основной задачей разработчиков ПО.</p>
<p>Иногда разработчики и&nbsp;дизайнеры обманывают себя, думая что&nbsp;UI штука простая и&nbsp;понятная, и&nbsp;если за&nbsp;плечами есть несколько лет опыта какого-либо софта, это мнение, почему-то укореняется. Хотя на&nbsp;практике, интерфейсы, штука совсем нетривиальная, и&nbsp;заниматься этим профессионально могут далеко не&nbsp;все компании, не&nbsp;то&nbsp;чтобы специалисты. Если по&nbsp;каким-то причинам вы&nbsp;думаете что вы&nbsp;умеете делать роскошные интерфейсы, предлагаю вашему вниманию отрывок из&nbsp;книги, в&nbsp;качестве чеклиста:</p>
<blockquote><p>Невозможно научиться делать роскошные интерфейсы, если&nbsp;вы:</p>
<ul>
<li>не&nbsp;умеете говорить&nbsp;и, особенно, слушать</li>
<li>не&nbsp;имеете вкуса</li>
<li>не&nbsp;умеете писать</li>
<li>не&nbsp;умеете долго думать логично</li>
<li>нелюбопытны</li>
</ul>
<p><strong>Неумение слушать и&nbsp;говорить</strong></p>
<p>Мой опыт найма сотрудников свидетельствует, что большинство людей обладают очень неразвитой эмпатией, т.&nbsp;е. не&nbsp;умеют представить себя на&nbsp;месте другого человека. Без сопереживания просто невозможно<br />
узнать, что людям нужно (в&nbsp;частности, что нужно и&nbsp;чего не&nbsp;нужно пользователям ваших интерфейсов). Если вы&nbsp;не&nbsp;сможете это узнать, вы&nbsp;не&nbsp;сможете это людям дать. Просто, как дважды два.</p>
<p>Проблема с&nbsp;этим утверждением заключается в&nbsp;том, что, подобно тому, как все уверены, что у&nbsp;них есть чувство юмора, все уверены, что с&nbsp;эмпатией у&nbsp;них всё очень хорошо.</p>
<p>Проверьте себя. Если вы&nbsp;не&nbsp;согласны (полностью или частично) с&nbsp;утверждениями:</p>
<p>Другие люди совсем не&nbsp;такие, как&nbsp;я. Их&nbsp;интересует не&nbsp;то, что интересует меня. Они мыслят иначе, чем&nbsp;я. Они знают&nbsp;то, что я&nbsp;не&nbsp;знаю. Они оценивают события по&nbsp;критериям, которые мне не&nbsp;известны и&nbsp;чужды.</p>
<p>...у вас, по&nbsp;всей видимости, проблемы с&nbsp;эмпатией. Придя на&nbsp;интервью с&nbsp;заказчиком, вы, скорее всего, слышите себя (а&nbsp;не&nbsp;заказчика), поскольку у&nbsp;вас нет стимула узнать что-то о&nbsp;другом человеке (я&nbsp;предполагаю, что для того, чтобы что-то узнать, нужно сначала признать, что это что-то ещё неизвестно). Это преодолимо, нужно всего лишь регулярно и&nbsp;методично напоминать себе, что другие люди&nbsp;&mdash; именно что другие. Кроме того, великолепно помогает тренировке эмпатии присутствие при юзабилити-тестировании своего интерфейса (можно смотреть записи его&nbsp;же; даже записи тестов чужих интерфейсов неплохо помогают тренировать эмпатию).</p>
<p><strong>Отсутствие вкуса</strong></p>
<p>Чтобы появилось само понятие красивого человека, большинство людей должно быть некрасивыми. Это&nbsp;же верно и&nbsp;для вкуса, с&nbsp;той только поправкой, что красота во&nbsp;многом есть свойство врождённое,<br />
а&nbsp;вкус&nbsp;&mdash; всегда приобретённый, никто не&nbsp;рождается с&nbsp;развитым чувством прекрасного. Его развитие занимает годы, и&nbsp;эти годы не&nbsp;просто надо прожить, но&nbsp;тратить время и&nbsp;усилия на&nbsp;развитие своего<br />
вкуса.</p>
<p>На&nbsp;мой взгляд, развитый вкус очень редок, хорошо ещё, если им&nbsp;обладают несколько процентов людей. Чисто статистически&nbsp;&mdash; вкуса у&nbsp;вас нет. А&nbsp;если это так, ваши интерфейсы (а&nbsp;они как-никак графические) будут уродливы, несмотря на&nbsp;все ваши усилия.</p>
<p>Проверьте себя. Если вы:</p>
<ul>
<li>в&nbsp;последние годы не&nbsp;были ни&nbsp;на&nbsp;одной художественной выставке</li>
<li>не&nbsp;купили в&nbsp;прошлом хотя&nbsp;бы трёх альбомов по&nbsp;искусству</li>
<li>не&nbsp;можете назвать хотя&nbsp;бы пять художников, которых вы&nbsp;особенно</li>
<li>любите, и&nbsp;не&nbsp;можете объяснить, за&nbsp;что именно вы&nbsp;их&nbsp;любите</li>
<li>не&nbsp;знаете названий хотя&nbsp;бы пяти архитектурных стилей и&nbsp;не&nbsp;можете</li>
<li>объяснить, чем они отличаются друг от&nbsp;друга</li>
</ul>
<p>...по-видимому, вы&nbsp;никогда не&nbsp;старались развить свой художественный вкус&nbsp;и, соответственно, у&nbsp;вас его нет. Идите в&nbsp;музей, прочтите несколько книг по&nbsp;искусствоведению, купите абонемент в&nbsp;консерваторию и&nbsp;т.&nbsp;п.</p>
<p><strong>Неумение писать</strong></p>
<p>Мысли имеют неприятное обыкновение из&nbsp;чётких и&nbsp;ясных становиться неоднозначными и&nbsp;неполными (а&nbsp;зачастую и&nbsp;самопротиворечивыми), стоит их&nbsp;только записать. Объясняется это просто&nbsp;&mdash; пока они ещё в<br />
голове, многие выводы, не&nbsp;говоря уж&nbsp;о&nbsp;противоречиях, попросту не&nbsp;видны. На&nbsp;бумаге&nbsp;же проблемы проступают немедленно.</p>
<p>Согласно Федору Тютчеву, мысль изречённая есть ложь. Мысль записанная тоже может быть ложью, но&nbsp;ложь эта, по&nbsp;крайней мере, не&nbsp;гарантированная, как в&nbsp;случае мысли высказанной.</p>
<p>На&nbsp;практике это обозначает следующее. Мы&nbsp;можем заметно повысить качество нашей мыслительной деятельности (а&nbsp;дизайн как раз является такой деятельностью), просто фиксируя свои рассуждения. Но<br />
это требует умения быстро писать, как технически (т.&nbsp;е. быстро набирать текст), так и&nbsp;творчески (т.&nbsp;е. оперативно составлять связный, читабельный текст).</p>
<p>Проверьте себя. В&nbsp;2000 знаков опишите, что вы&nbsp;видите вокруг в&nbsp;этот самый момент, отмечая самое замечательное в&nbsp;том, что вы&nbsp;видите. Покажите текст кому-нибудь, кто, по&nbsp;вашему мнению, хорошо &laquo;знает<br />
русского языка&raquo;. Если задание далось вам с&nbsp;большим трудом или знаток языка раскритиковал его в&nbsp;пух и&nbsp;прах, поздравляю&nbsp;&mdash; вы&nbsp;не&nbsp;писатель. Купите пару книг по&nbsp;редактуре (см. раздел Рекомендуемая литература) и&nbsp;практикуйтесь до&nbsp;посинения. Лично я&nbsp;научился хоть как-то писать только после семисот тысяч написанных знаков.</p>
<p><strong>Проблемы с&nbsp;логикой</strong></p>
<p>Чтобы были умные люди, большинство должно быть глупыми. Но&nbsp;ум, как и&nbsp;глупость, понятие растяжимое. Меня сейчас интересует только один сорт глупости, а&nbsp;именно неумение рассуждать о&nbsp;чем-то скучном продолжительное время.</p>
<p>Например, поиск в&nbsp;интерфейсе исключительных ситуаций (предпосылок для ошибок, как системных, так и&nbsp;человеческих)&nbsp;&mdash; совершенно необходимая стадия дизайна. Чисто технически&nbsp;&mdash; это очень продол-<br />
жительное рассуждение, при котором дизайнер последовательно перебирает все объекты и&nbsp;состояния интерфейса в&nbsp;поиске возможных несоответствий (&laquo;так, а&nbsp;что будет, если пользователь нажмёт кнопку<br />
поиска, не&nbsp;введя ничего в&nbsp;поле ввода?&raquo;). Многие люди (в&nbsp;том числе большинство т.н. гуманитариев) сталкиваются в&nbsp;этой работе с&nbsp;большими трудностями&nbsp;&mdash; нетренированному мозгу это очень тяжело и<br />
утомительно. Конечно, практика тренирует мозг очень быстро, но, поскольку эта работа такова, что её&nbsp;можно &laquo;задвинуть&raquo;, отфутболив программисту, практики не&nbsp;получается. Отсюда&nbsp;&mdash; невозможность<br />
профессионального роста.</p>
<p>Проверьте себя. Найдите какую-нибудь книгу логических задач (особо рекомендую книги Раймонда Смаллиана) и&nbsp;попробуйте решать&nbsp;их, не&nbsp;отвлекаясь, не&nbsp;менее полутора часов подряд. Если дело не&nbsp;идет&nbsp;&mdash; найдите ещё десяток таких книг и&nbsp;решайте, решайте, решайте. Интеллектуальный марафон не&nbsp;повредит.</p>
<p><strong>Отсутствие профессионального любопытства</strong></p>
<p>Профессиональный рост на&nbsp;основе только собственной работы настолько долог, что, пожалуй, и&nbsp;невозможен. А&nbsp;чтобы интересоваться чем-либо за&nbsp;пределами собственной текучки, нужно любопытство.<br />
Проверьте себя. Если вы:</p>
<ul>
<li>не&nbsp;знаете, кто такие Джозайа Веджвуд и&nbsp;Раймонд Лоуи</li>
<li>не&nbsp;знаете, что такое интерлиньяж</li>
<li>не&nbsp;можете перечислить хотя&nbsp;бы пять интерфейсных решений, которые в&nbsp;Windows лучше по&nbsp;сравнению с&nbsp;MacOS (и&nbsp;обратно)</li>
</ul>
<p>...у вас скоро будут проблемы с&nbsp;полимерами (или уже). Решение очевидно: поставьте себе за&nbsp;цель каждый месяц читать хотя&nbsp;бы одну книгу по&nbsp;дизайну. Через год сами поймете, как развиваться дальше.</p>
<p><strong>Что делать?</strong></p>
<p>Подводя итог&nbsp;&mdash; все эти недостатки можно преодолеть (теоретически), но&nbsp;это потребует нешуточных усилий. Большинство людей страдают от&nbsp;этих недостатков, так что чисто статистически можно предположить, что они есть и&nbsp;у&nbsp;вас. Если вы&nbsp;не&nbsp;сможете их&nbsp;исправить, что&nbsp;ж, эта книга не&nbsp;пойдет вам на&nbsp;пользу&nbsp;&mdash; всё равно будете делать ерунду. Уж&nbsp;лучше заняться чем-нибудь другим.</p></blockquote>
<p>Если по&nbsp;роду работы сталкиваетесь с&nbsp;пользовательскими интерфейсами и&nbsp;у&nbsp;вас обнаружились пробелы, надеюсь это подтолкнет вас к&nbsp;тому, чтобы найти хорошего специалиста которому можно поручить столь важный этап в&nbsp;работы, либо подтолкнет к&nbsp;самообучению и&nbsp;даже, возможно вы&nbsp;начнете с&nbsp;книги a&nbsp;href=&quot;http://uibook2.usethics.ru/&quot;&gt;&quot;Дизайн пользовательского интерфейса<sup>2</sup> Искусство мыть слона&quot;. Ну&nbsp;а&nbsp;если у&nbsp;вас никаких пробелов не&nbsp;обнаружилось, то&nbsp;знайте, мне очень приятно что вы&nbsp;посетили мой сайт.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/books/ui-book/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Инструменты анализа кода на предмет &#171;говнокода&#187;, copy/paste, соответствию стандартам</title>
		<link>http://sheremetov.com/php/pm-tools/</link>
		<comments>http://sheremetov.com/php/pm-tools/#comments</comments>
		<pubDate>Wed, 12 May 2010 05:00:43 +0000</pubDate>
		<dc:creator>sheremetov</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://sheremetov.com/?p=726</guid>
		<description><![CDATA[Если вы&#160;работаете с&#160;командой php-разработчиков, то&#160;вы&#160;знаете как много кода они пишут, особенно если это высокопроизводительная команда разработчиков. программистам свойственно автоматизировать любой рутинный труд, поэтому и&#160;труд по&#160;контролю над кодом тоже понемногу автоматизируется.
Самым полезным, для меня, оказался инструмент Copy/Paste Detector for PHP code. Как ясно из&#160;названия, этот инструмент используется для дублирующегося кода, ярым поборником которого я&#160;являюсь.
Устанавливается он&#160;очень просто, [...]]]></description>
			<content:encoded><![CDATA[<p>Если вы&nbsp;работаете с&nbsp;командой php-разработчиков, то&nbsp;вы&nbsp;знаете как много кода они пишут, особенно если это высокопроизводительная команда разработчиков. программистам свойственно автоматизировать любой рутинный труд, поэтому и&nbsp;труд по&nbsp;контролю над кодом тоже понемногу автоматизируется.</p>
<p>Самым полезным, для меня, оказался инструмент <a href="http://github.com/sebastianbergmann/phpcpd">Copy/Paste Detector for PHP code</a>. Как ясно из&nbsp;названия, этот инструмент используется для дублирующегося кода, ярым поборником которого я&nbsp;являюсь.</p>
<p>Устанавливается он&nbsp;очень просто, как PEAR пакет:</p>
<pre>sb@ubuntu ~ % pear channel-discover pear.phpunit.de
Adding Channel "pear.phpunit.de" succeeded
Discovery of channel "pear.phpunit.de" succeeded

sb@ubuntu ~ % pear channel-discover components.ez.no
Adding Channel "components.ez.no" succeeded
Discovery of channel "components.ez.no" succeeded

sb@ubuntu ~ % pear install phpunit/phpcpd
downloading phpcpd-1.3.0.tgz ...
Starting to download phpcpd-1.3.0.tgz (7,809 bytes)
.....done: 7,809 bytes
downloading File_Iterator-1.1.0.tgz ...
Starting to download File_Iterator-1.1.0.tgz (3,181 bytes)
...done: 3,181 bytes
downloading ConsoleTools-1.6.tgz ...
Starting to download ConsoleTools-1.6.tgz (869,925 bytes)
.........................................................
.........................................................
.........................................................
..done: 869,925 bytes
downloading Base-1.8.tgz ...
Starting to download Base-1.8.tgz (236,357 bytes)
...done: 236,357 bytes
install ok: channel://components.ez.no/Base-1.8
install ok: channel://components.ez.no/ConsoleTools-1.6
install ok: channel://pear.phpunit.de/File_Iterator-1
install ok: channel://pear.phpunit.de/phpcpd-1.3.0</pre>
<p>Пользоваться, тоже,&nbsp;&mdash; очень просто:</p>
<pre>bash-3.2# phpcpd PEAR/tests/
phpcpd 1.3.1 by Sebastian Bergmann.

Found 5 exact clones with 85 duplicated lines in 5 files:

  - MDB2/tests/MDB2_extended_testcase.php:398-404
    MDB2/tests/MDB2_extended_testcase.php:453-459

  - MDB2/tests/MDB2_manager_testcase.php:61-75
    MDB2/tests/MDB2_reverse_testcase.php:86-100

  - MDB2/tests/MDB2_usage_testcase.php:1289-1321
    MDB2/tests/MDB2_usage_testcase.php:1577-1609

  - MDB2/tests/MDB2_usage_testcase.php:1567-1593
    MDB2/tests/MDB2_usage_testcase.php:1739-1765

  - Structures_Graph/tests/testCase/BasicGraph.php:111-118
    Structures_Graph/tests/testCase/BasicGraph.php:142-149</pre>
<p>Еще один полезный инструмент, это <a href="http://pdepend.org/">PHP Depend</a>. Он&nbsp;позволяет взглянуть на&nbsp;ваш проект, как&nbsp;бы, с&nbsp;&laquo;высоты птичьего полета&raquo;, предоставляя такие метрики как: количество строк кода, классов, пакетов, методов, вызовов и&nbsp;даже эмпирическую метрику &laquo;сложность кода&raquo;. <a href="http://manuel-pichler.de/categories/3-php/P4.html">Здесь</a> можно прочитать расшифровку всех показателей.</p>
<p>Я&nbsp;сравнил два довольно больших проекта, которые веду и&nbsp;метрики отразили в&nbsp;цифрах почти то&nbsp;же что и&nbsp;было &laquo;по&nbsp;ощущению&raquo;,&nbsp;&mdash; более новый проект проще и&nbsp;лучше приблизительно в&nbsp;<nobr>2-3 раза,</nobr> при том что имеет более сложную бизнес логику и&nbsp;функционал:</p>
<p><a href="http://sheremetov.com/wp-content/uploads/2010/05/pyramid.svg_.jpg"><img class="alignleft size-medium wp-image-728" title="pyramid.svg" src="http://sheremetov.com/wp-content/uploads/2010/05/pyramid.svg_-300x61.jpg" alt="" width="300" height="61" /></a></p>
<p>Следующий, хороший инструмент это <a href="http://phpmd.org/">PHP Mess detector</a>. Устанавливается он&nbsp;аналогично, с&nbsp;помощью PEAR installer:</p>
<pre>mapi@arwen ~ $ pear channel-discover pear.phpmd.org
mapi@arwen ~ $ pear channel-discover pear.pdepend.org
mapi@arwen ~ $ pear install --alldeps phpmd/PHP_PMD-alpha</pre>
<p>Эта утилита дает нам массу интересной информации для размышления:</p>
<pre>bash-3.2# phpmd PEAR/Pear.php text codesize

PEAR.php:87	This class has a bunch of public methods and attributes
PEAR.php:87	This class has too many methods, consider refactoring it.
PEAR.php:87	This class PEAR has an overall complexity of 102 which is very high. The configured complexity threshold is 50.
PEAR.php:323	The method setErrorHandling() has a Cyclomatic Complexity of 11.
PEAR.php:511	The method raiseError() has a Cyclomatic Complexity of 20.
PEAR.php:511	The method raiseError() has an NPath complexity of 1600.
PEAR.php:771	The function _PEAR_call_destructors() has a Cyclomatic Complexity of 12.
PEAR.php:831	This class has a bunch of public methods and attributes
PEAR.php:866	The method PEAR_Error() has a Cyclomatic Complexity of 19.
PEAR.php:866	The method PEAR_Error() has an NPath complexity of 11520.

bash-3.2# phpmd PEAR/Pear.php text unusedcode

PEAR.php:450	Avoid unused local variables such as '$key'.
PEAR.php:788	Avoid unused local variables such as '$k'.</pre>
<p>Здесь важно насколько много проблемных мест в&nbsp;вашем коде. Изучая подобные отчеты вы&nbsp;будете всегда видеть какие части приложения должны быть подвергнуты рефакторингу в&nbsp;первую очередь.</p>
<p>Похожий по&nbsp;своему применению инструмент <a href="http://matrix.squiz.net/developer/tools/php_cs">PHP_CodeSniffer</a>, позволяет оценить насколько ваш код соответствует стандартам кодирования.</p>
]]></content:encoded>
			<wfw:commentRss>http://sheremetov.com/php/pm-tools/feed/</wfw:commentRss>
		<slash:comments>6</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). Этот паттерн позволяет скрывать от клиента логику создания запрашиваемого объекта.
Этот паттерн следует применять когда заранее неизвестно объекты каких классов должны быть созданы, поскольку предполагается множество различных вариантов работы, либо объекты, которые класс создает должны быть определены уже в подклассе.
Пример применения паттерна на UML диаграмме:

А [...]]]></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>3</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>
	</channel>
</rss>
