﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-bruceleey's columns  -随笔分类-设计模式</title><link>http://www.blogjava.net/invoked/category/41849.html</link><description>It's better to burn out, than fade away.</description><language>zh-cn</language><lastBuildDate>Sat, 26 Sep 2009 07:06:36 GMT</lastBuildDate><pubDate>Sat, 26 Sep 2009 07:06:36 GMT</pubDate><ttl>60</ttl><item><title>策略模式</title><link>http://www.blogjava.net/invoked/archive/2009/09/26/296531.html</link><dc:creator>invoked</dc:creator><author>invoked</author><pubDate>Sat, 26 Sep 2009 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/invoked/archive/2009/09/26/296531.html</guid><wfw:comment>http://www.blogjava.net/invoked/comments/296531.html</wfw:comment><comments>http://www.blogjava.net/invoked/archive/2009/09/26/296531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/invoked/comments/commentRss/296531.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/invoked/services/trackbacks/296531.html</trackback:ping><description><![CDATA[&nbsp; 策略模式设计原则(几乎所有的模式都是如此)：
<p>&nbsp;&nbsp;1.找出应用中可能需要变化之处，把它们独立出来，不要和那些不需要变化的代码混在一起。</p>
<p>&nbsp;&nbsp;2.针对接口编程而不是实现.</p>
<p>&nbsp;&nbsp;3.多用组合，少用继承.</p>
<p>&nbsp;&nbsp;策略模式定义：<span style="color: red;">定义了算法族，分别封装起来，让它们之间可以相互替换，此模式让算法的变化独立于使用算法的客户。</span></p>
<p>&nbsp;&nbsp;PS：算法族即行为族&nbsp;</p>
<p>&nbsp;&nbsp;使用策略模式构建一个小应用，比如在鸟类中最基本的行为族(也就是算法族) 飞行与鸣叫，而每种鸟的行为甚至都不一致，如果要你写个程序来演示鸟类(各类别)，你该怎么做？</p>
<p>&nbsp;&nbsp;参看策略模式的定义：<span style="color: red;">定义算法族，分别封装起来。</span></p>
<p>&nbsp;&nbsp;我们可以将飞行与鸣叫的定义封装成接口，参看代码：</p>
<p>&nbsp;&nbsp;<span style="color: #008000;">/**</span></p>
<div><span style="color: #008000;">&nbsp;*&nbsp;飞行基类<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;BruceLeey<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IFly&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;fly();<br />
</span></div>
<p>}&nbsp;</p>
<div><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;叫唤基类<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;BruceLeey<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IYell&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;yell();<br />
}</span></div>
<p>根据不同鸟类飞行的特点生成飞行与鸣叫的实现，比如：</p>
<p>&nbsp;<span style="color: #008000;">/**</span></p>
<div><span style="color: #008000;">&nbsp;*&nbsp;麻雀飞行实现类<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;BruceLeey<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MaqFly&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;IFly{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;fly()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">麻雀飞起来小巧，速度慢！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<p><br />
</p>
<div><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;老鹰飞行的实现类<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;BruceLeey<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;YingFly&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;IFly{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;fly()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">老鹰的飞行速度很快，猎物几乎无处可逃！</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span></div>
<p>}&nbsp;</p>
<p>鸟类中也存在不会飞的鸟，比如鸵鸟<img src="http://www.cnblogs.com/Emoticons/yoyocici/224023586.gif" alt="" /></p>
<div><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;不会飞<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;BruceLeey<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;NowayFly&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;IFly{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;fly()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">很抱歉，它不会飞!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span></div>
<p>}&nbsp;</p>
<p>&nbsp;&nbsp;鸣叫的实现也是如此。接下来我们就可以定义鸟类的基本类了。</p>
<p>&nbsp;&nbsp;<span style="color: #008000;">/**</span></p>
<div><span style="color: #008000;">&nbsp;*&nbsp;鸟类基类<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;BruceLeey<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">abstract</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Bird&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;IFly&nbsp;fly;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;IYell&nbsp;yell;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;fly()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fly.fly();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;yell()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yell.yell();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">abstract</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;display();&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setIFly(IFly&nbsp;fly)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.fly&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fly;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;IFly&nbsp;getIFly()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span>&nbsp;<span style="color: #0000ff;">this</span><span style="color: #000000;">.fly;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setIYell(IYell&nbsp;yell)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.yell&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;yell;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;IYell&nbsp;getIYell()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span>&nbsp;<span style="color: #0000ff;">this</span><span style="color: #000000;">.yell;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>&nbsp;&nbsp;算法族由GetSet倾入，在基类中将行为实现，但不具体指定，具体指定留由客户。麻雀类实现如下，其他的写法亦是如此。</p>
<p>&nbsp;&nbsp;<span style="color: #008000;">/**</span></p>
<div><span style="color: #008000;">&nbsp;*&nbsp;麻雀<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;BruceLeey<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Maq&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;Bird{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;display()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">我是麻雀!!!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span></div>
<p>}&nbsp;&nbsp;</p>
<p>&nbsp;在麻雀的实现类里我们已经将行为委托到父类，父类则委托给对应的行为接口，这就是：<span style="color: red;">针对接口编程而不是实现。</span></p>
<p>&nbsp;测试代码与测试信息如下：</p>
<p>&nbsp;<span style="color: #008000;">/**</span></p>
<div><span style="color: #008000;">&nbsp;*<br />
&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;BruceLeey<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TestBird&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;TestCase{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;testMaq()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bird&nbsp;bird</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Maq();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.setIFly(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MaqFly());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.setIYell(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;MaqYell());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.fly();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.yell();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;testYing()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bird&nbsp;bird</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Ying();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.setIFly(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;YingFly());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.setIYell(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;YingYell());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.fly();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.yell();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;testTuon()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bird&nbsp;bird</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Tuon();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.setIFly(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;NowayFly());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.setIYell(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;TuonYell());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.display();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.fly();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bird.yell();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>输出如下：</p>
<p>我是麻雀!!!</p>
<p>麻雀飞起来小巧，速度慢！</p>
<p>麻雀叫起来吱吱的声音~~~</p>
<p>我是老鹰!!!</p>
<p>老鹰的飞行速度很快，猎物几乎无处可逃！</p>
<p>老鹰叫唤起来是：啸～～～～</p>
<p>我是鸵鸟！！！</p>
<p>很抱歉，它不会飞!</p>
<p>鸵鸟叫唤起来我也不知道～～～--#</p>
<p>&nbsp;</p>
<p><span style="color: red;">参考资料：《Head First Designer pattern》</span> <br />
</p>
<img src ="http://www.blogjava.net/invoked/aggbug/296531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/invoked/" target="_blank">invoked</a> 2009-09-26 14:47 <a href="http://www.blogjava.net/invoked/archive/2009/09/26/296531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>