<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.2.1" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Comments on: Паттерн Strategy (Стратегия)</title>
	<link>http://www.javenue.info/post/12</link>
	<description>Блог разработчика о Java и родственных технологиях</description>
	<pubDate>Fri, 21 Nov 2008 09:37:48 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>

	<item>
		<title>By: walv</title>
		<link>http://www.javenue.info/post/12#comment-29305</link>
		<author>walv</author>
		<pubDate>Thu, 09 Oct 2008 12:30:18 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-29305</guid>
		<description>Это в _идеальном_ ООП не должно быть if-else-case и т.д., а идеального нету ничего. Возьмите исходники Java библиотек, тоже ведь не идеально написаны. Но и не дети то писали их.</description>
		<content:encoded><![CDATA[<p>Это в _идеальном_ ООП не должно быть if-else-case и т.д., а идеального нету ничего. Возьмите исходники Java библиотек, тоже ведь не идеально написаны. Но и не дети то писали их.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: GS</title>
		<link>http://www.javenue.info/post/12#comment-28676</link>
		<author>GS</author>
		<pubDate>Mon, 29 Sep 2008 02:47:54 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-28676</guid>
		<description>А чего никто не упомянул про динамическую загрузку то?
Это раз.

Т.е. вообще строго говоря хорошим примером было бы чтото типа:

String selectedStratagy = ... ; // тут получили откудато стратегию которую нада юзать.

Algoritm al = Class.forName(""+selectedStratagy).newInstance(); //"" - сюда можно дописать чтонить.

al.crypt(param1, param2);
-------------------------
И два.
Вопрос был про то как уйти от if-else, и хоть в моем примере - их нет, по сути они вынесены на более высокий уровень. Так как гдето-то выбирается имя для selectedStratagy.

Этой теме посвещена целая "Теория приянтия решения", раздел математики. 

Выбор конкретной методики поиска пути решения (тоесть в нашем случае - то как мы выбираем алгоритм) я считаю зависит от задачи.

И если гдето это будет мат функция, возвращающая каким либо образом идентификатор, в другом месте это может быть например набор правил. В третьем это может быть вообще нейро сеть, которая на выходе выдаст идентификатор алгоритма.

Тоесть на самом деле - универсального ответа - как избавится от if - else - нет. Ессно в рамках этого вопроса.</description>
		<content:encoded><![CDATA[<p>А чего никто не упомянул про динамическую загрузку то?<br />
Это раз.</p>
<p>Т.е. вообще строго говоря хорошим примером было бы чтото типа:</p>
<p>String selectedStratagy = &#8230; ; // тут получили откудато стратегию которую нада юзать.</p>
<p>Algoritm al = Class.forName(&#8221;"+selectedStratagy).newInstance(); //&#8221;" - сюда можно дописать чтонить.</p>
<p>al.crypt(param1, param2);<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
И два.<br />
Вопрос был про то как уйти от if-else, и хоть в моем примере - их нет, по сути они вынесены на более высокий уровень. Так как гдето-то выбирается имя для selectedStratagy.</p>
<p>Этой теме посвещена целая &#8220;Теория приянтия решения&#8221;, раздел математики. </p>
<p>Выбор конкретной методики поиска пути решения (тоесть в нашем случае - то как мы выбираем алгоритм) я считаю зависит от задачи.</p>
<p>И если гдето это будет мат функция, возвращающая каким либо образом идентификатор, в другом месте это может быть например набор правил. В третьем это может быть вообще нейро сеть, которая на выходе выдаст идентификатор алгоритма.</p>
<p>Тоесть на самом деле - универсального ответа - как избавится от if - else - нет. Ессно в рамках этого вопроса.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Anna</title>
		<link>http://www.javenue.info/post/12#comment-25338</link>
		<author>Anna</author>
		<pubDate>Wed, 23 Jul 2008 14:37:50 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-25338</guid>
		<description>Я тоже не вижу, причем здесь вобще к паттерну case в теле функции main. Собственно, реализация паттерна локализована совсем в другом месте. Можно конечно присобачить еще пару десятков классов для выбора стратегии из оракла, но зачем?... Увидел case - кричи "пожар". Это похоже на недопонимание вопроса.</description>
		<content:encoded><![CDATA[<p>Я тоже не вижу, причем здесь вобще к паттерну case в теле функции main. Собственно, реализация паттерна локализована совсем в другом месте. Можно конечно присобачить еще пару десятков классов для выбора стратегии из оракла, но зачем?&#8230; Увидел case - кричи &#8220;пожар&#8221;. Это похоже на недопонимание вопроса.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Шурик</title>
		<link>http://www.javenue.info/post/12#comment-25015</link>
		<author>Шурик</author>
		<pubDate>Fri, 11 Jul 2008 13:00:21 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-25015</guid>
		<description>Когда сам начал изучать паттерны, тоже шло отторжение таких вот высосаных примеров. Но потом когда начинаешь кодить, доходишь до этого сам, смотришь и думаешь: е-моё, паттерн вылепился. И в след. раз уже намного проще и быстрее к похожему варианту приходишь.</description>
		<content:encoded><![CDATA[<p>Когда сам начал изучать паттерны, тоже шло отторжение таких вот высосаных примеров. Но потом когда начинаешь кодить, доходишь до этого сам, смотришь и думаешь: е-моё, паттерн вылепился. И в след. раз уже намного проще и быстрее к похожему варианту приходишь.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: alexander</title>
		<link>http://www.javenue.info/post/12#comment-21986</link>
		<author>alexander</author>
		<pubDate>Tue, 04 Mar 2008 15:45:35 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-21986</guid>
		<description>а почему собственно "В настоящем ООП не должно быть if-в тем более case-в" ?
интересует конкретный ответ.</description>
		<content:encoded><![CDATA[<p>а почему собственно &#8220;В настоящем ООП не должно быть if-в тем более case-в&#8221; ?<br />
интересует конкретный ответ.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: c0nst</title>
		<link>http://www.javenue.info/post/12#comment-21020</link>
		<author>c0nst</author>
		<pubDate>Thu, 31 Jan 2008 10:23:32 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-21020</guid>
		<description>Если зарегистрировано более одного алгоритма, как выбрать конкретный из них в runtime? Выбор основывается на сравнении, соответственно и на условии.

Есть конечно другой вариант. Пример - несколько приложений исползьзуют одно и то же API. Каждое приложение может иметь свою стратегию построения путей к файлам на файловой системе. Серверное приложение делает это через бины (читает из БД); GUI приложение - через свои настройки; тестовый фреймворк - на основании входящих данных. В этом случае выбор стратегии сделан заранее.

2 Victor: Но пример хороший, спасибо. Надо будет дополнить статью информацией о регистрации новых алгоритмов.</description>
		<content:encoded><![CDATA[<p>Если зарегистрировано более одного алгоритма, как выбрать конкретный из них в runtime? Выбор основывается на сравнении, соответственно и на условии.</p>
<p>Есть конечно другой вариант. Пример - несколько приложений исползьзуют одно и то же API. Каждое приложение может иметь свою стратегию построения путей к файлам на файловой системе. Серверное приложение делает это через бины (читает из БД); GUI приложение - через свои настройки; тестовый фреймворк - на основании входящих данных. В этом случае выбор стратегии сделан заранее.</p>
<p>2 Victor: Но пример хороший, спасибо. Надо будет дополнить статью информацией о регистрации новых алгоритмов.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Victor Conovalov</title>
		<link>http://www.javenue.info/post/12#comment-21018</link>
		<author>Victor Conovalov</author>
		<pubDate>Thu, 31 Jan 2008 08:52:38 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-21018</guid>
		<description>a kak nascet takogo?

public abstract class Strategy {
	public Strategy() 
	{
	} 
	public abstract void doAlgoritm();
}

public class Context {

	private Strategy strategy;
	public final static int DEFAULT_ALGORITM = 0;
	private Map algorimts = new HashMap() ;
	
	public Context(Strategy strategy)
	{
		this.strategy = strategy;
		algorimts.put(new Integer(DEFAULT_ALGORITM), strategy);
	}

	public void registerAlgoritm(int key, Strategy strategy)
	{
		algorimts.put(new Integer(key), strategy);
	}

	public void registerAlgoritm(Strategy strategy)
	{
		algorimts.put(new Integer(DEFAULT_ALGORITM), strategy);
	}

	public void ContextStrategy()
	{
		ContextStrategy(DEFAULT_ALGORITM);
	}
	
	public void ContextStrategy(int key)
	{
		algorimts.get(new Integer(key)).doAlgoritm();
	} 
}</description>
		<content:encoded><![CDATA[<p>a kak nascet takogo?</p>
<p>public abstract class Strategy {<br />
	public Strategy()<br />
	{<br />
	}<br />
	public abstract void doAlgoritm();<br />
}</p>
<p>public class Context {</p>
<p>	private Strategy strategy;<br />
	public final static int DEFAULT_ALGORITM = 0;<br />
	private Map algorimts = new HashMap() ;</p>
<p>	public Context(Strategy strategy)<br />
	{<br />
		this.strategy = strategy;<br />
		algorimts.put(new Integer(DEFAULT_ALGORITM), strategy);<br />
	}</p>
<p>	public void registerAlgoritm(int key, Strategy strategy)<br />
	{<br />
		algorimts.put(new Integer(key), strategy);<br />
	}</p>
<p>	public void registerAlgoritm(Strategy strategy)<br />
	{<br />
		algorimts.put(new Integer(DEFAULT_ALGORITM), strategy);<br />
	}</p>
<p>	public void ContextStrategy()<br />
	{<br />
		ContextStrategy(DEFAULT_ALGORITM);<br />
	}</p>
<p>	public void ContextStrategy(int key)<br />
	{<br />
		algorimts.get(new Integer(key)).doAlgoritm();<br />
	}<br />
}</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: c0nst</title>
		<link>http://www.javenue.info/post/12#comment-20788</link>
		<author>c0nst</author>
		<pubDate>Mon, 21 Jan 2008 18:42:33 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-20788</guid>
		<description>Пост 2 года назад был написан... И тогда я учился, и сейчас учусь. Не делает ошибок только тот, кто вообще ничего не делает.
И все же, в который раз: кто-нибудь, покажите мне другой способ выбора алгоритма в runtime, кроме как конструкций типа if или switch. Намекаю, что обязательно будет место в коде, где необходимо условие выбора нужного алгоритма (стратегии). Главное свести количество таких мест к минимуму (1).</description>
		<content:encoded><![CDATA[<p>Пост 2 года назад был написан&#8230; И тогда я учился, и сейчас учусь. Не делает ошибок только тот, кто вообще ничего не делает.<br />
И все же, в который раз: кто-нибудь, покажите мне другой способ выбора алгоритма в runtime, кроме как конструкций типа if или switch. Намекаю, что обязательно будет место в коде, где необходимо условие выбора нужного алгоритма (стратегии). Главное свести количество таких мест к минимуму (1).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: kojak</title>
		<link>http://www.javenue.info/post/12#comment-20787</link>
		<author>kojak</author>
		<pubDate>Mon, 21 Jan 2008 17:42:41 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-20787</guid>
		<description>Я смотрю, вам Батенька, учится и учится. 
Конфузите читателей с вашим объяснением.
Предыдущий оратор выложил правильный пример использования.</description>
		<content:encoded><![CDATA[<p>Я смотрю, вам Батенька, учится и учится.<br />
Конфузите читателей с вашим объяснением.<br />
Предыдущий оратор выложил правильный пример использования.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Slava2</title>
		<link>http://www.javenue.info/post/12#comment-20072</link>
		<author>Slava2</author>
		<pubDate>Mon, 10 Dec 2007 18:48:32 +0000</pubDate>
		<guid>http://www.javenue.info/post/12#comment-20072</guid>
		<description>Поддержу теску - пример не совсем верный, желательно еще почитать банду 4х - там, кстати данный пример показан в качестве антипримера.

Правильный пример:

public class Encryption {
	private Algorithm _algorithm;
	public Encryption(Algorithm algorithm) {
		_algorithm = algorithm;		
	}

	public String Crypt(String text, String key) {
		return _algorithm.crypt(text,key);
	}		
}

И соответственно, уже при создании объекта этого класса:
Encryption enc = new Encryption(new DESAlgorythm());
Encryption enc = new Encryption(new RSAAlgorythm());

и уже тогда:
String crypString = enc.Crypt("String","Key");
;)</description>
		<content:encoded><![CDATA[<p>Поддержу теску - пример не совсем верный, желательно еще почитать банду 4х - там, кстати данный пример показан в качестве антипримера.</p>
<p>Правильный пример:</p>
<p>public class Encryption {<br />
	private Algorithm _algorithm;<br />
	public Encryption(Algorithm algorithm) {<br />
		_algorithm = algorithm;<br />
	}</p>
<p>	public String Crypt(String text, String key) {<br />
		return _algorithm.crypt(text,key);<br />
	}<br />
}</p>
<p>И соответственно, уже при создании объекта этого класса:<br />
Encryption enc = new Encryption(new DESAlgorythm());<br />
Encryption enc = new Encryption(new RSAAlgorythm());</p>
<p>и уже тогда:<br />
String crypString = enc.Crypt(&#8221;String&#8221;,&#8221;Key&#8221;);<br />
 <img src='http://www.javenue.info/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
	</item>
</channel>
</rss>
