﻿<?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-Chan Chen Coding...-文章分类-Design Pattern</title><link>http://www.blogjava.net/czihong/category/52037.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 24 Nov 2012 00:20:51 GMT</lastBuildDate><pubDate>Sat, 24 Nov 2012 00:20:51 GMT</pubDate><ttl>60</ttl><item><title>Twelve: Iterator Design Pattern</title><link>http://www.blogjava.net/czihong/articles/390859.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Tue, 06 Nov 2012 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390859.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390859.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390859.html</trackback:ping><description><![CDATA[<h3>Iterator (aka Cursor) Overview</h3><div style="font-size: 0.95em; background-color: white; vertical-align: top; padding-top: 5px; padding-bottom: 5px; padding-left: 5px; margin-bottom: 5px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 17px; ">One object can traverse all of the elements of another object.</div><br style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 17px; background-color: #ffffff; " /><br style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 17px; background-color: #ffffff; " /><iframe allowtransparency="true" frameborder="0" height="60" hspace="0" marginwidth="0" marginheight="0" scrolling="no" vspace="0" width="468" id="aswift_0" name="aswift_0" style="left: 0px; position: absolute; top: 0px; "></iframe><br style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 17px; background-color: #ffffff; " /><br style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 17px; background-color: #ffffff; " /><h3>DvdListIterator.java - the Iterator Interface</h3><div style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 17px; font-size: 0.875em; background-color: #f0f0f0; "><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;behavioral.interator.pattern;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;DvdListIterator&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;first();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;next();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isDone();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;currentItem();<br />}</div></pre></div><h3>DvdList.java - the Concrete Aggregate (with a Concrete Iterator inner class)</h3><div style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 17px; font-size: 0.875em; background-color: #f0f0f0; "><pre></pre></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;behavioral.interator.pattern;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DvdList&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String[]&nbsp;&nbsp;&nbsp;&nbsp;titles;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titleCount;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arraySize;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;DvdList()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titles&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String[3];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titleCount&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arraySize&nbsp;=&nbsp;3;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;count()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;titleCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;append(String&nbsp;titleIn)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(titleCount&nbsp;&gt;=&nbsp;arraySize)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;tempArray&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String[arraySize];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;arraySize;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempArray[i]&nbsp;=&nbsp;titles[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titles&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arraySize&nbsp;=&nbsp;arraySize&nbsp;+&nbsp;3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titles&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String[arraySize];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;(arraySize&nbsp;-&nbsp;3);&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titles[i]&nbsp;=&nbsp;tempArray[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titles[titleCount++]&nbsp;=&nbsp;titleIn;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;delete(String&nbsp;titleIn)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;found&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;(titleCount&nbsp;-&nbsp;1);&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(found&nbsp;==&nbsp;<span style="color: #0000FF; ">false</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(titles[i].equals(titleIn))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;found&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titles[i]&nbsp;=&nbsp;titles[i&nbsp;+&nbsp;1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(i&nbsp;&lt;&nbsp;(titleCount&nbsp;-&nbsp;1))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titles[i]&nbsp;=&nbsp;titles[i&nbsp;+&nbsp;1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;titles[i]&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(found&nbsp;==&nbsp;<span style="color: #0000FF; ">true</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--titleCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;DvdListIterator&nbsp;createIterator()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;InnerIterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;InnerIterator&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;DvdListIterator&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;currentPosition&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;InnerIterator()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;first()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentPosition&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;next()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(currentPosition&nbsp;&lt;&nbsp;(titleCount))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++currentPosition;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isDone()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(currentPosition&nbsp;&gt;=&nbsp;(titleCount))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;currentItem()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;titles[currentPosition];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 17px; background-color: #ffffff; " /><br style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 17px; background-color: #ffffff; " /><a href="https://sourcemaking.com/design-patterns-video2?a=5527" style="color: #0066cc; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 17px; background-color: #ffffff; font-weight: bold; font-size: 1.2em; ">Try the Design Patterns Video Tutorial from SourceMaking</a><br style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 17px; background-color: #ffffff; " /><br style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 17px; background-color: #ffffff; " /><h3>TestDvdIterator.java - testing the iterator</h3><div style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 17px; font-size: 0.875em; background-color: #f0f0f0; "><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;behavioral.interator.pattern;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TestDvdIterator&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DvdList&nbsp;fiveShakespeareMovies&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DvdList();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareMovies.append("10&nbsp;Things&nbsp;I&nbsp;Hate&nbsp;About&nbsp;You");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareMovies.append("Shakespeare&nbsp;In&nbsp;Love");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareMovies.append("O&nbsp;(2001)");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareMovies.append("American&nbsp;Pie&nbsp;2");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareMovies.append("Scotland,&nbsp;PA.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareMovies.append("Hamlet&nbsp;(2000)");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DvdListIterator&nbsp;fiveShakespeareIterator&nbsp;=&nbsp;fiveShakespeareMovies.createIterator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(!fiveShakespeareIterator.isDone())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fiveShakespeareIterator.currentItem());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareIterator.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareMovies.delete("American&nbsp;Pie&nbsp;2");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("&nbsp;");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareIterator.first();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(!fiveShakespeareIterator.isDone())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fiveShakespeareIterator.currentItem());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fiveShakespeareIterator.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></pre></div><h3>Test Results</h3><div style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 17px; font-size: 0.875em; background-color: #f0f0f0; "><pre><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->10&nbsp;Things&nbsp;I&nbsp;Hate&nbsp;About&nbsp;You<br />Shakespeare&nbsp;In&nbsp;Love<br />O&nbsp;(2001)<br />American&nbsp;Pie&nbsp;2<br />Scotland,&nbsp;PA.<br />Hamlet&nbsp;(2000)<br />&nbsp;<br />10&nbsp;Things&nbsp;I&nbsp;Hate&nbsp;About&nbsp;You<br />Shakespeare&nbsp;In&nbsp;Love<br />O&nbsp;(2001)<br />Scotland,&nbsp;PA.<br />Hamlet&nbsp;(2000)</div></pre></div><h3>UML</h3><div style="font-size: 0.95em; background-color: white; vertical-align: top; padding-top: 5px; padding-bottom: 5px; padding-left: 5px; margin-bottom: 5px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 17px; "><a href="http://www.fluffycat.com/javasource/javapatterns/UML/Iterator.jpg" style="color: black; ">UML for Iterator</a></div><h3>References</h3><img src ="http://www.blogjava.net/czihong/aggbug/390859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-11-06 10:49 <a href="http://www.blogjava.net/czihong/articles/390859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eleven: Memento Design Pattern</title><link>http://www.blogjava.net/czihong/articles/390848.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Tue, 06 Nov 2012 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390848.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390848.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390848.html</trackback:ping><description><![CDATA[<div>Refer to:http://blog.sina.com.cn/s/blog_4a2100f8010142n1.html</div><div></div><div>1.1.1.概述</div><div>备忘录是一个非常容易理解的模式，只需要看一下后面的客户端测试代码就能明白备忘录模式的用意。备忘录模式就是用来保存对象的某一个状态，这样在一定时候，可以通过备忘录来恢复对象的状态。</div><div>针对上面所说的用意，实现起来就需要一个类来保存这个状态，这个类就是备忘录类。鉴于备忘录很容易理解，就直接看后面的代码实现吧。</div><div>1.1.2.代码实现</div><div>在代码实现中，备忘录模式一共有三个类，Originator类是原始的对象，正是这个对象的状态需要备忘，这样是为了在一个时间，这个对象可以恢复到备忘的状态。还有一个类是Memento，这个是备忘录，用于保存Originator类的状态。还有一个类CareTaker用来管理备忘录。</div><div>首先看Originator的代码实现。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;用于创建备忘录的原发器，记录当前的内部状态</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Originator<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;当前的状态</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;string&nbsp;state;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;创建一个当前状态的备忘录</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Memento&nbsp;CreateMemento()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Memento(<span style="color: #0000FF; ">this</span>.state);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;恢复当前状态为备忘录所保存的状态</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;param&nbsp;name="memento"&gt;&lt;/param&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;RestoreMemento(Memento&nbsp;memento)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.state&nbsp;=&nbsp;memento.GetState();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;string&nbsp;GetState()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;SetState(string&nbsp;state)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.state&nbsp;=&nbsp;state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div>Originator类具有一个状态属性，这个属性代表了Originator对象的实时状态，CreateMemento()方法用来保存Originator对象的一个状态作为备忘，在以后需要的时候可以显示。也就是说通过这个方法就可以给Originator对象产生一个备忘录。RestoreMemento()方法用来从保存的备忘录中恢复Originator的状态，将Originator的状态设置为之前的一个备忘状态。</div><div>下面是备忘录类Memento类的代码实现。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;备忘录类</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Memento<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;备忘录所保存的状态</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;string&nbsp;state;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;构造函数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;param&nbsp;name="state"&gt;&lt;/param&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Memento(string&nbsp;state)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.state&nbsp;=&nbsp;state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;string&nbsp;GetState()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;SetState(string&nbsp;state)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.state&nbsp;=&nbsp;state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div>因为Memento类需要保存Originator对象的状态，所以Memento具有一个Originator状态一样的属性state，这个state用来保存Originator的一个状态。</div><div>Memento类的管理者是CareTaker类，CareTaker类的代码如下。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;负责保存备忘录的管理员</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CareTaker<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;备忘录</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Memento&nbsp;memento;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;返回所拥有的备忘录</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Memento&nbsp;retrieveMemento()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.memento;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;保存一个备忘录</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;param&nbsp;name="memento"&gt;&lt;/param&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;SaveMemento(Memento&nbsp;memento)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.memento&nbsp;=&nbsp;memento;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div>CareTaker类用来管理Memento对象，所以自身拥有一个Memento对象。并且有一个设置Memento对象方法（SaveMemento）和一个取得Memento的方法（retrieveMemento）。</div><div>备忘录模式的核心代码已经定义好了，下面通过客户端代码来测试一下备忘录模式。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Originator&nbsp;o&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Originator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;CareTaker&nbsp;c&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CareTaker();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Test()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.SetState("On");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.SaveMemento(o.CreateMemento());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("第一次为"&nbsp;+&nbsp;o.GetState());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.SetState("Off");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("第二次为"&nbsp;+&nbsp;o.GetState());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;o.RestoreMemento(c.retrieveMemento());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("恢复到上一次为"&nbsp;+&nbsp;o.GetState());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div>在客户端代码中，定义了一个Originator的对象o和CareTaker 的对象c，首先对o设置了一个状态，并且通过c（c是管理备忘录的）来把o目前的状态备忘（保存为备忘录）。然后继续设置了一下o的状态，在此时，o想恢复自己的状态到之前，因为想恢复的状态保存在了备忘录中，所以通过o的RestoreMemento可以将状态恢复为备忘录所记载的状态。</div><div>客户端的测试代码演示的是备忘录模式的意图，而之前的代码演示的是备忘录模式的结构。</div><div>&nbsp;</div><div>1.1.3.模型表示</div><div></div><div>备忘录模式的UML类图如下所示。</div><div></div><div></div><div>在备忘录模式的类模型图中可以看出来，Originator，Memento和CareTaker三者之间的关系，Memento用来保存Originator的一个状态，Caretaker用来管理Memento。在Originator需要Memento的时候，通过Caretaker即可得到。在Originator需要备忘一个状态的时候，通过Caretaker即可备忘。</div><div>1.1.4.模式分析</div><div></div><div>备忘录模式就是用来在对象的外部可以保存对象的一个内部状态。用来存储另外一个对象内部状态的快照。备忘录即对象的一个检查点，也是一个还原点。</div><div>检查点：某一个快照所处的位置（即一个状态）。</div><div>备忘录模式的意图是在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态，这样以后就可以将该对象恢复到原先保存的状态。</div><div>通过代码实现中的客户端测试代码即可看到备忘录模式的使用场景：</div><div>1、必须保存一个对象在某一个时刻的状态，这样以后需要的时候就能恢复到之前的状态。</div><div>2、如果用接口来让其他对象直接得到这些状态，将会暴露对象的实现细节并破坏对象的封装性。</div><div>&nbsp;</div><div>通过使用备忘录模式，可以达到一些效果：</div><div>1、保持封装边界。应用使用备忘录模式，将Originator对象中的一些细节隔离到了Caretaker和Memento中。保持了Originator类内部信息对其他对象的隐藏，从而保持了封装边界。</div><div>2、简化了Originator类，将Originator类中的一些操作交给了Caretaker和Memento。</div><div>3、增加了额外的代价，使用了备忘录模式，就导致了Originator类中的状态在产生备忘录的时候复制了信息，这样如果需要备忘的信息量很大，那么备忘录模式会导致额外大量的开销。</div><div>4、定义窄接口和宽接口。一些语言中可能难以保证只有Originator可访问备忘录的状态。也就是说Originator之外的对象可能会访问Memento的状态，导致不安全。</div><div>5、维护备忘录存在潜在的代价。Caretaker在维护Memento的时候，因为Caretaker不知道备忘录Memento所保存的状态数量，所以在通过Caretaker来保存Memento的时候，可能会导致大量的存储开销。</div><div>&nbsp;</div><div>因为效果4所说的潜在的安全问题，备忘录还有另外一种安全的实现方式，也就是将Memento定义为Originator的内部类，这样的话Memento也就是只有Originator才能访问了。</div><div>安全模式的一种备忘录模式代码实现，如下：</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;IMementoSafeMode<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div>定义一个备忘录的接口，这样就封装了备忘录的访问，外部的类都通过访问接口来访问备忘录。备忘录模式的一个要点就是不破坏封装性。</div><div>下面是一种安全实现的备忘录管理员类的实现。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CareTakerSafeMode<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;IMementoSafeMode&nbsp;memento;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IMementoSafeMode&nbsp;RetriveMemento()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.memento;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;SaveMemento(IMementoSafeMode&nbsp;memento)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.memento&nbsp;=&nbsp;memento;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div>通过接口的实现，管理员完全不会访问备忘录类的，这样就使得备忘录类只会暴露给和他有关系的类，这也是单一原则的体现，即迪米特法则（LOD）：只与你的朋友通信，不和陌生人说话。</div><div>下面是安全的备忘录模式的核心实现。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;OriginatorSafeMode<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;string&nbsp;state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;OriginatorSafeMode()&nbsp;{&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IMementoSafeMode&nbsp;CreateMemento()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MementoSafeMode&nbsp;mbox&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MementoSafeMode(<span style="color: #0000FF; ">this</span>.state);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;mbox;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;RestoreMemento(IMementoSafeMode&nbsp;memento)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MementoSafeMode&nbsp;mementoSafeMode&nbsp;=&nbsp;(MementoSafeMode)memento;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.state&nbsp;=&nbsp;mementoSafeMode.State;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;string&nbsp;State<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.state;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{&nbsp;<span style="color: #0000FF; ">this</span>.state&nbsp;=&nbsp;value;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MementoSafeMode&nbsp;:&nbsp;IMementoSafeMode<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;string&nbsp;state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;/summary&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">/&nbsp;&lt;param&nbsp;name="state"&gt;&lt;/param&gt;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MementoSafeMode(string&nbsp;state)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.state&nbsp;=&nbsp;state;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;string&nbsp;State<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.state;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{&nbsp;<span style="color: #0000FF; ">this</span>.state&nbsp;=&nbsp;value;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></div><div>在之前的备忘录模式中，备忘录模式Memento和Originator类是分开的，这里将Memento作为Originator的内部类，这样限制了Memento的访问范围，即只有Originator类的内部才能访问。</div><div>注意C#和JAVA在处理内部类的时候有不一致的地方。C#中内部类的Public属性只能是外部类范围内访问，如果是private则外部类也无法访问，只有在内部类之内才能访问。但是在java中要实现这样的效果，内部类的所有属性都必须是Private，这样才限制了只有外部类访问。在java中，外部类类似于一个命名空间，通过外部类可以看到内部类（OriginatorSafeMode.MementoSafeMode这样的写法就导致了内部类的暴露，只不过无法实例化而已）。即使不能实例化，但是也对外暴露了内部类。在C#中这一点有所改进，内部类在外面根本无法看到。</div><div>实现了内部类的UML类图省略，内部类在UML中使用圈里面包含的一个叉来显示，另一端是箭头，箭头指向的是内部类。Visual Studio 2010中自带的UML类图和Visio中的UML类图都不支持内部类的表示，使用rose可以画。</div><div></div><div>1.1.5.思想</div><div></div><div>目的：在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。</div><div>实现思想：用一个Memento的类来保存需要恢复的状态，可以是一个或者多个。并且由另一个类CareTaker来负责恢复。</div><div>1.1.6.应用</div><div></div><div>应用中如果有类似历史记录机制的功能，那么这个功能有可能就能使用备忘录模式，因为历史记录就是一个过去的状态，那么如果要访问历史记录就表示要恢复状态。保存历史记录的类就是一个备忘录类。</div><div>当然了，如果理解了之前的备忘录模式的实现，那么根据其要点&#8220;恢复到原先保存的状态&#8221;，那么如果需要恢复一个类的状态到以前的某个状态，则备忘录基本上就可以搞定，但是，切忌杀鸡用牛刀的悲剧。</div><div style="color: #323e32; font-family: simsun; background-color: #18380f; ">
</div><img src ="http://www.blogjava.net/czihong/aggbug/390848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-11-06 09:45 <a href="http://www.blogjava.net/czihong/articles/390848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ten: Mediator Design Pattern</title><link>http://www.blogjava.net/czihong/articles/390799.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Mon, 05 Nov 2012 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390799.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390799.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390799.html</trackback:ping><description><![CDATA[<div>Refer to: http://blog.sina.com.cn/s/blog_3fe961ae0100qbz6.html</div><div></div><div>意图</div><div></div><div>通过引入中介者模式来在对象之间传递消息（承担中介者），以简化对象之间的通信。</div><div>什么是中介者模式</div><div></div><div>中介者模式包装了一系列对象相互作用的方式，使得这些对象不必互相明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时，不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。</div><div>在中介者模式中，所有的成员对象者可以协调工作，但是又不直接相互管理。这些对象都与一个处于中心地位的中介者对象发生紧密的关系，由这个中介者对象进行协调工作。这个协调者对象叫做中介者（Mediator），而中介者所协调的成员对象称做同事（Colleague）对象。</div><div>类图</div><div></div><div></div><div></div><div>角色</div><div></div><div>（1）抽象中介者（Mediator）角色：定义出同事对象到中介者对象的接口，其中主要的方法是一个（或者多个）事件方法。在有些情况下，这个抽象对象可以省略。</div><div>（2）具体中介者（ConcreteMediator）角色：从抽象中介者继承而来，实现了抽象超类所声明的事件方法。具体中介者知晓所有的具体同事类，它从具体同事对象接收消息、向具体同事对象发出命令。</div><div>（3）抽象同事类（Colleague）角色：定义出中介者到同事对象的接口。同事对象只知道中介者而不知道其余的同事对象。</div><div>（4）具体同事类（ConcreteColleague）角色：所有的具体同事类均从抽象同事类继承而来。每一个具体同事类都很清楚它自己在小范围内的行为，而不知道它在大范围内的目的。在示意性的类图中，具体同事类是Colleague1和Colleague2。</div><div>&nbsp;</div><div>源代码</div><div></div><div>package 中介者模式;</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<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; ">抽象中介者</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Mediator&nbsp;{<br />&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">事件方法，由子类实现</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;colleagueChanged(Colleague&nbsp;c);<br />}</div></div><div>&nbsp;</div><div>&nbsp;</div><div>package 中介者模式;</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<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; ">抽象同事类</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Colleague&nbsp;{<br /><span style="color: #0000FF; ">&nbsp; private</span>&nbsp;Mediator&nbsp;mediator;<br />&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">构造函数，中介者作为参数</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;Colleague(Mediator&nbsp;m){<br /><span style="color: #0000FF; ">&nbsp; this</span>.mediator=m;<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;Mediator&nbsp;getMediator(){<br /><span style="color: #0000FF; ">&nbsp; return</span>&nbsp;<span style="color: #0000FF; ">this</span>.mediator;<br />}<br />&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">行动方法，由子类实现</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;action();<br />&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">当同事对象发生变化时，告知中介者</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;change(){<br />&nbsp; mediator.colleagueChanged(<span style="color: #0000FF; ">this</span>);<br />}<br />}<br />&nbsp;<br />&nbsp;<br /><span style="color: #0000FF; ">package</span>&nbsp;中介者模式;<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Colleague1&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Colleague&nbsp;{<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;Colleague1(Mediator&nbsp;m)&nbsp;{<br /><span style="color: #0000FF; ">&nbsp; super</span>(m);<br />}<br />&nbsp;<br />@Override<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;action()&nbsp;{<br />&nbsp; System.out.println("Colleague1&nbsp;action");<br />}<br />&nbsp;<br />}</div></div><div>&nbsp;</div><div>&nbsp;</div><div>&nbsp;</div><div>package 中介者模式;</div><div>&nbsp;</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Colleague2&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Colleague&nbsp;{<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;Colleague2(Mediator&nbsp;m)&nbsp;{<br /><span style="color: #0000FF; ">&nbsp; super</span>(m);<br />}<br />&nbsp;<br />@Override<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;action()&nbsp;{<br />&nbsp; System.out.println("Colleague2&nbsp;action");<br />}<br />&nbsp;<br />}</div></div><div>&nbsp;</div><div>&nbsp;</div><div>&nbsp;</div><div>package 中介者模式;</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<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; ">具体中介者</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ConcreteMediator&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Mediator{<br />&nbsp;<br /><span style="color: #0000FF; ">private</span>&nbsp;Colleague1&nbsp;colleague1;<br /><span style="color: #0000FF; ">private</span>&nbsp;Colleague2&nbsp;colleague2;<br />&nbsp;<br />@Override<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;colleagueChanged(Colleague&nbsp;c)&nbsp;{<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">中介者通知其它同事对象作出响应，实际的代码要复杂得多</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">&nbsp; if</span>(c==colleague1){<br />&nbsp; &nbsp; System.out.println("colleague1发生改变，其他同事对象作出响应");<br /><span style="color: #0000FF; ">&nbsp; &nbsp; this</span>.colleague2.action();<br />&nbsp; }<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>(c==colleague2){<br />&nbsp; &nbsp; System.out.println("colleague2发生改变，其他同事对象作出响应");<br /><span style="color: #0000FF; ">&nbsp; &nbsp; this</span>.colleague1.action();<br />&nbsp; }<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;createConcreteColleague(){<br />&nbsp; colleague1=<span style="color: #0000FF; ">new</span>&nbsp;Colleague1(<span style="color: #0000FF; ">this</span>);<br />&nbsp; colleague2=<span style="color: #0000FF; ">new</span>&nbsp;Colleague2(<span style="color: #0000FF; ">this</span>);<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;Colleague1&nbsp;getColleague1()&nbsp;{<br /><span style="color: #0000FF; ">&nbsp; return</span>&nbsp;colleague1;<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;Colleague2&nbsp;getColleague2()&nbsp;{<br /><span style="color: #0000FF; ">return</span>&nbsp;colleague2;<br />}<br />}</div></div><div>&nbsp;</div><div>&nbsp;</div><div>package 中介者模式;</div><div>&nbsp;</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Client&nbsp;{<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp; ConcreteMediator&nbsp;m&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcreteMediator();<br />&nbsp; m.createConcreteColleague();<br />&nbsp; Colleague&nbsp;c1=m.getColleague1();<br />&nbsp; Colleague&nbsp;c2=m.getColleague2();<br />&nbsp; c1.change();<br />&nbsp; c2.change();<br />&nbsp;}<br />}</div></div><div>&nbsp;</div><div>输出：</div><div>colleague1发生改变，其他同事对象作出响应</div><div>Colleague2 action</div><div>colleague2发生改变，其他同事对象作出响应</div><div>Colleague1 action</div><img src ="http://www.blogjava.net/czihong/aggbug/390799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-11-05 11:45 <a href="http://www.blogjava.net/czihong/articles/390799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nine: Interpreter Design Pattern</title><link>http://www.blogjava.net/czihong/articles/390784.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Mon, 05 Nov 2012 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390784.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390784.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390784.html</trackback:ping><description><![CDATA[<p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; ">Interpreter解释器设计模式的定义：给定一个语言，定义其文法的一种表示，并定义一个解释器，这个解释器使用该表示来解释语言中的句子。</p><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; ">Interpreter解释器设计模式角色如下：</p><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; ">(1).抽象表达式(AbstractExpression)角色：声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要定义一个interpret()方法，称做解释操作。&nbsp;<br />(2).终结符表达式(TerminalExpression)角色：没有子节点的表达式。&nbsp;<br />(3).非终结符表达式(NonterminalExpression)角色：有子节点的表达式，解释操作以递归方式调用其子节点表达式。&nbsp;</p><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; ">(4).上下文(Context)角色：上下文提供解释器之外的一些全局信息，比如变量的真实量值等。&nbsp;</p><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; ">Interpreter解释器设计模式结构如下：</p><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; "><img src="http://my.csdn.net/uploads/201206/06/1338973681_4810.jpg" alt="" style="border: none; " /><br /></p><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; "></p><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; ">通过编写一个模拟java中日期格式化为指定字符串的例子来演示Interpreter解释器设计模式，代码如下：</p><div bg_java"="" style="width: 959.2999877929688px; line-height: 26px; "><strong>[java]</strong>&nbsp;<a href="http://blog.csdn.net/chjttony/article/details/7639016#" title="view plain" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat; ">view plain</a><a href="http://blog.csdn.net/chjttony/article/details/7639016#" title="copy" style="background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_copy.gif); padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-position: 0% 0%; background-repeat: no-repeat no-repeat; ">copy<br /><br /></a><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">package</span>&nbsp;behavioral.interpreter.pattern;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;AbstractExpression&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;format(Date&nbsp;date);;<br />}<br /><br /><br /><br /><span style="color: #0000FF; ">package</span>&nbsp;behavioral.interpreter.pattern;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Calendar;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;DataFormatExpression&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;AbstractExpression&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern1&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;"yyyy-MM-dd";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern2&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;"yyyy/MM/dd";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Calendar&nbsp;&nbsp;&nbsp;&nbsp;calendar&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;Calendar.getInstance();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;separator&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;"";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;DataFormatExpression()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;DataFormatExpression(String&nbsp;pattern)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pattern1.equals(pattern))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;separator&nbsp;=&nbsp;"-";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pattern.equals(pattern))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;separator&nbsp;=&nbsp;"/";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getYear(Calendar&nbsp;cal)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cal.get(Calendar.YEAR)&nbsp;+&nbsp;"";<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getMonth(Calendar&nbsp;cal)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;month&nbsp;=&nbsp;cal.get(Calendar.MONTH)&nbsp;+&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;month&nbsp;&lt;&nbsp;10&nbsp;?&nbsp;"0"&nbsp;+&nbsp;month&nbsp;:&nbsp;""&nbsp;+&nbsp;month;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getDay(Calendar&nbsp;cal)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;day&nbsp;=&nbsp;cal.get(Calendar.DAY_OF_MONTH);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;day&nbsp;&lt;&nbsp;10&nbsp;?&nbsp;"0"&nbsp;+&nbsp;day&nbsp;:&nbsp;""&nbsp;+&nbsp;day;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;format(Date&nbsp;date)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calendar.setTime(date);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;getYear(calendar)&nbsp;+&nbsp;separator&nbsp;+&nbsp;getMonth(calendar)&nbsp;+&nbsp;separator&nbsp;+&nbsp;getDay(calendar);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /><br /><br /><span style="color: #0000FF; ">package</span>&nbsp;behavioral.interpreter.pattern;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;InterpreterDemo&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Date();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractExpression&nbsp;expression1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DataFormatExpression();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(expression1.format(date));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractExpression&nbsp;expression2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DataFormatExpression("yyyy-MM-dd");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(expression2.format(date));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractExpression&nbsp;expression3&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DataFormatExpression("yyyy/MM/dd");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(expression3.format(date));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; ">Interpreter解释器设计模式的应用场景：</p><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; ">在软件构建过程中，若果某一特定领域的问题比较复杂，类似的模式不断重复出现，如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下，将特定领域的问题表达为某种语法规则下的句子，再构建一个解释器来解释这样的句子，从而达到解决问题的目的。</p><p align="left" style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff; ">JDK中Interpreter解释器设计模式典型应用就是正则表达式。</p><img src ="http://www.blogjava.net/czihong/aggbug/390784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-11-05 10:34 <a href="http://www.blogjava.net/czihong/articles/390784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eight: State Design Pattern</title><link>http://www.blogjava.net/czihong/articles/390681.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Fri, 02 Nov 2012 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390681.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390681.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390681.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: State Design Pattern is mainly for changing state at run-time.The Java example below shows how State pattern works.The idea behind the example: people normally work harder when they are poor and play ...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/390681.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/390681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-11-02 14:56 <a href="http://www.blogjava.net/czihong/articles/390681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Seven: Visitor Design Pattern</title><link>http://www.blogjava.net/czihong/articles/390677.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Fri, 02 Nov 2012 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390677.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390677.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390677.html</trackback:ping><description><![CDATA[<p style="margin: 0.4em 0px 0.5em; line-height: 19.200000762939453px; font-family: sans-serif; font-size: 13px; background-color: #ffffff; ">In&nbsp;<a href="http://en.wikipedia.org/wiki/Object-oriented_programming" title="Object-oriented programming" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">object-oriented programming</a>&nbsp;and&nbsp;<a href="http://en.wikipedia.org/wiki/Software_engineering" title="Software engineering" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">software engineering</a>, the&nbsp;<strong>visitor</strong>&nbsp;<a href="http://en.wikipedia.org/wiki/Software_design_pattern" title="Software design pattern" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">design pattern</a>&nbsp;is a way of separating an&nbsp;<a href="http://en.wikipedia.org/wiki/Algorithm" title="Algorithm" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">algorithm</a>&nbsp;from an object structure on which it operates. A practical result of this separation is the ability to add new operations to existing object structures without modifying those structures. It is one way to easily follow the&nbsp;<a href="http://en.wikipedia.org/wiki/Open/closed_principle" title="Open/closed principle" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">open/closed principle</a>.</p><p style="margin: 0.4em 0px 0.5em; line-height: 19.200000762939453px; font-family: sans-serif; font-size: 13px; background-color: #ffffff; ">In essence, the visitor allows one to add new&nbsp;<a href="http://en.wikipedia.org/wiki/Virtual_function" title="Virtual function" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">virtual functions</a>&nbsp;to a family of classes without modifying the classes themselves; instead, one creates a visitor class that implements all of the appropriate specializations of the virtual function. The visitor takes the instance reference as input, and implements the goal through&nbsp;<a href="http://en.wikipedia.org/wiki/Double_dispatch" title="Double dispatch" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">double dispatch</a>.<br /><br /><a href="http://upload.wikimedia.org/wikipedia/en/7/7f/VisitorClassDiagram.svg" style="color: #0b0080; background-image: none; "><img alt="File:VisitorClassDiagram.svg" src="http://upload.wikimedia.org/wikipedia/en/thumb/7/7f/VisitorClassDiagram.svg/487px-VisitorClassDiagram.svg.png" width="487" height="439" style="border: none; vertical-align: middle; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGElEQVQYV2N4DwX/oYBhgARgDJjEAAkAAEC99wFuu0VFAAAAAElFTkSuQmCC); background-repeat: repeat repeat; " /><br /><br /><br /><br /></a><div style="background-color: #eeeeee; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">interface</span>&nbsp;CarElementVisitor&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Wheel&nbsp;wheel);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Engine&nbsp;engine);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Body&nbsp;body);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Car&nbsp;car);<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">interface</span>&nbsp;CarElement&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;accept(CarElementVisitor&nbsp;visitor);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;CarElements&nbsp;have&nbsp;to&nbsp;provide&nbsp;accept().</span><span style="color: #008000; "><br /></span>}<br />&nbsp;<br /><span style="color: #0000FF; ">class</span>&nbsp;Wheel&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;CarElement&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;name;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Wheel(String&nbsp;name)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.name&nbsp;=&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getName()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.name;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;accept(CarElementVisitor&nbsp;visitor)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;accept(CarElementVisitor)&nbsp;in&nbsp;Wheel&nbsp;implements<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;accept(CarElementVisitor)&nbsp;in&nbsp;CarElement,&nbsp;so&nbsp;the&nbsp;call<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;to&nbsp;accept&nbsp;is&nbsp;bound&nbsp;at&nbsp;run&nbsp;time.&nbsp;This&nbsp;can&nbsp;be&nbsp;considered<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;first&nbsp;dispatch.&nbsp;However,&nbsp;the&nbsp;decision&nbsp;to&nbsp;call<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;visit(Wheel)&nbsp;(as&nbsp;opposed&nbsp;to&nbsp;visit(Engine)&nbsp;etc.)&nbsp;can&nbsp;be<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;made&nbsp;during&nbsp;compile&nbsp;time&nbsp;since&nbsp;'this'&nbsp;is&nbsp;known&nbsp;at&nbsp;compile<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;time&nbsp;to&nbsp;be&nbsp;a&nbsp;Wheel.&nbsp;Moreover,&nbsp;each&nbsp;implementation&nbsp;of<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;CarElementVisitor&nbsp;implements&nbsp;the&nbsp;visit(Wheel),&nbsp;which&nbsp;is<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;another&nbsp;decision&nbsp;that&nbsp;is&nbsp;made&nbsp;at&nbsp;run&nbsp;time.&nbsp;This&nbsp;can&nbsp;be<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;considered&nbsp;the&nbsp;second&nbsp;dispatch.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visitor.visit(<span style="color: #0000FF; ">this</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">class</span>&nbsp;Engine&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;CarElement&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;accept(CarElementVisitor&nbsp;visitor)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visitor.visit(<span style="color: #0000FF; ">this</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">class</span>&nbsp;Body&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;CarElement&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;accept(CarElementVisitor&nbsp;visitor)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visitor.visit(<span style="color: #0000FF; ">this</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">class</span>&nbsp;Car&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;CarElement&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;CarElement[]&nbsp;elements;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Car()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">create&nbsp;new&nbsp;Array&nbsp;of&nbsp;elements</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.elements&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CarElement[]&nbsp;{&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Wheel("front&nbsp;left"),&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Wheel("front&nbsp;right"),&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Wheel("back&nbsp;left")&nbsp;,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Wheel("back&nbsp;right"),&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Body(),&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Engine()&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;accept(CarElementVisitor&nbsp;visitor)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(CarElement&nbsp;elem&nbsp;:&nbsp;elements)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elem.accept(visitor);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visitor.visit(<span style="color: #0000FF; ">this</span>);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">class</span>&nbsp;CarElementPrintVisitor&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;CarElementVisitor&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Wheel&nbsp;wheel)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Visiting&nbsp;"&nbsp;+&nbsp;wheel.getName()&nbsp;+&nbsp;"&nbsp;wheel");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Engine&nbsp;engine)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Visiting&nbsp;engine");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Body&nbsp;body)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Visiting&nbsp;body");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Car&nbsp;car)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Visiting&nbsp;car");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">class</span>&nbsp;CarElementDoVisitor&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;CarElementVisitor&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Wheel&nbsp;wheel)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Kicking&nbsp;my&nbsp;"&nbsp;+&nbsp;wheel.getName()&nbsp;+&nbsp;"&nbsp;wheel");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Engine&nbsp;engine)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Starting&nbsp;my&nbsp;engine");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Body&nbsp;body)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Moving&nbsp;my&nbsp;body");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;visit(Car&nbsp;car)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Starting&nbsp;my&nbsp;car");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;VisitorDemo&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Car&nbsp;car&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Car();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;car.accept(<span style="color: #0000FF; ">new</span>&nbsp;CarElementPrintVisitor());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;car.accept(<span style="color: #0000FF; ">new</span>&nbsp;CarElementDoVisitor());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></p><img src ="http://www.blogjava.net/czihong/aggbug/390677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-11-02 14:16 <a href="http://www.blogjava.net/czihong/articles/390677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Six: Composite pattern</title><link>http://www.blogjava.net/czihong/articles/390627.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Thu, 01 Nov 2012 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390627.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390627.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390627.html</trackback:ping><description><![CDATA[<span style="font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; background-color: #ffffff; ">In&nbsp;</span><a href="http://en.wikipedia.org/wiki/Software_engineering" title="Software engineering" style="text-decoration: none; color: #0b0080; background-image: none; background-color: #ffffff; font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; ">software engineering</a><span style="font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; background-color: #ffffff; ">, the&nbsp;</span><strong style="font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; background-color: #ffffff; ">composite pattern</strong><span style="font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; background-color: #ffffff; ">&nbsp;is a partitioning&nbsp;</span><a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)" title="Design pattern (computer science)" style="text-decoration: none; color: #0b0080; background-image: none; background-color: #ffffff; font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; ">design pattern</a><span style="font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; background-color: #ffffff; ">. The composite pattern describes that a group of objects are to be treated in the same way as a single instance of an object. The intent of a composite is to "compose" objects into tree structures to represent part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects and compositions uniformly.<br /><br /></span><h2 style="background-image: none; background-color: #ffffff; font-weight: normal; margin: 0px 0px 0.6em; overflow: hidden; padding-top: 0.5em; padding-bottom: 0.17em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #aaaaaa; font-size: 19px; font-family: sans-serif; line-height: 19.200000762939453px; "><span class="mw-headline" id="Motivation">Motivation</span></h2><p style="margin: 0.4em 0px 0.5em; line-height: 19.200000762939453px; font-family: sans-serif; font-size: 13px; background-color: #ffffff; ">When dealing with Tree-structured data, programmers often have to discriminate between a leaf-node and a branch. This makes code more complex, and therefore, error prone. The solution is an interface that allows treating complex and primitive objects uniformly. In&nbsp;<a href="http://en.wikipedia.org/wiki/Object-oriented_programming" title="Object-oriented programming" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">object-oriented programming</a>, a composite is an object designed as a composition of one-or-more similar objects, all exhibiting similar functionality. This is known as a "<a href="http://en.wikipedia.org/wiki/Has-a" title="Has-a" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">has-a</a>" relationship between objects.<sup id="cite_ref-1" class="reference" style="line-height: 1em; "><a href="http://en.wikipedia.org/wiki/Composite_pattern#cite_note-1" style="text-decoration: none; color: #0b0080; background-image: none; white-space: nowrap; background-position: initial initial; background-repeat: initial initial; ">[2]</a></sup>&nbsp;The key concept is that you can manipulate a single instance of the object just as you would manipulate a group of them. The operations you can perform on all the composite objects often have a&nbsp;<a href="http://en.wikipedia.org/wiki/Least_common_denominator" title="Least common denominator" class="mw-redirect" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">least common denominator</a>&nbsp;relationship. For example, if defining a system to portray grouped shapes on a screen, it would be useful to define resizing a group of shapes to have the same effect (in some sense) as resizing a single shape.</p><h2 style="background-image: none; background-color: #ffffff; font-weight: normal; margin: 0px 0px 0.6em; overflow: hidden; padding-top: 0.5em; padding-bottom: 0.17em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #aaaaaa; font-size: 19px; font-family: sans-serif; line-height: 19.200000762939453px; "><span class="editsection" style="-webkit-user-select: none; float: right; font-size: 13px; margin-left: 5px; ">[<a href="http://en.wikipedia.org/w/index.php?title=Composite_pattern&amp;action=edit&amp;section=2" title="Edit section: When to use" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">edit</a>]</span><span class="mw-headline" id="When_to_use">When to use</span></h2><p style="margin: 0.4em 0px 0.5em; line-height: 19.200000762939453px; font-family: sans-serif; font-size: 13px; background-color: #ffffff; ">Composite can be used when clients should ignore the difference between compositions of objects and individual objects.<sup id="cite_ref-GangOfFour_0-1" class="reference" style="line-height: 1em; "><a href="http://en.wikipedia.org/wiki/Composite_pattern#cite_note-GangOfFour-0" style="text-decoration: none; color: #0b0080; background-image: none; white-space: nowrap; background-position: initial initial; background-repeat: initial initial; ">[1]</a></sup>&nbsp;If programmers find that they are using multiple objects in the same way, and often have nearly identical code to handle each of them, then composite is a good choice; it is less complex in this situation to treat primitives and composites as homogeneous.</p><h2><span id="Structure">Structure</span></h2><div tnone"="" style="margin-bottom: 0.5em; width: auto; background-color: #ffffff; font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; "><div style="min-width: 100px; border: 1px solid #cccccc; background-color: #f9f9f9; font-size: 12px; text-align: center; overflow: hidden; padding: 3px !important; width: 602px; "><a href="http://en.wikipedia.org/w/index.php?title=File:Composite_UML_class_diagram_(fixed).svg&amp;page=1" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; "><img alt="" src="http://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Composite_UML_class_diagram_%28fixed%29.svg/600px-Composite_UML_class_diagram_%28fixed%29.svg.png" width="600" height="388" style="border: 1px solid #cccccc; vertical-align: middle; background-color: #ffffff; " /></a><div style="border: none; line-height: 1.4em; padding: 3px !important; text-align: left; "><div style="border: none !important; background-image: none !important; float: right; background-position: initial initial !important; background-repeat: initial initial !important; "><a href="http://en.wikipedia.org/wiki/File:Composite_UML_class_diagram_(fixed).svg" title="Enlarge" style="text-decoration: none; color: #0b0080; background-image: none !important; display: block; border: none !important; background-position: initial initial !important; background-repeat: initial initial !important; "><img src="http://bits.wikimedia.org/static-1.21wmf1/skins/common/images/magnify-clip.png" width="15" height="11" alt="" style="border: none !important; vertical-align: middle; display: block; background-image: none !important; background-position: initial initial !important; background-repeat: initial initial !important; " /></a></div>Composite pattern in&nbsp;<a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language" title="Unified Modeling Language" style="text-decoration: none; color: #0b0080; background-image: none; background-position: initial initial; background-repeat: initial initial; ">UML</a>.</div></div></div><dl style="margin-top: 0.2em; margin-bottom: 0.5em; font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; background-color: #ffffff; "><dt style="font-weight: bold; margin-bottom: 0.1em; ">Component</dt></dl><ul style="line-height: 19.200000762939453px; list-style-type: square; margin: 0.3em 0px 0px 1.6em; padding: 0px; list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAANAQMAAABb8jbLAAAABlBMVEX///8AUow5QSOjAAAAAXRSTlMAQObYZgAAABNJREFUCB1jYEABBQw/wLCAgQEAGpIDyT0IVcsAAAAASUVORK5CYII=); font-family: sans-serif; font-size: 13px; background-color: #ffffff; "><li style="margin-bottom: 0.1em; ">is the abstraction for all components, including composite ones</li><li style="margin-bottom: 0.1em; ">declares the interface for objects in the composition</li><li style="margin-bottom: 0.1em; ">(optional) defines an interface for accessing a component's parent in the recursive structure, and implements it if that's appropriate</li></ul><dl style="margin-top: 0.2em; margin-bottom: 0.5em; font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; background-color: #ffffff; "><dt style="font-weight: bold; margin-bottom: 0.1em; ">Leaf</dt></dl><ul style="line-height: 19.200000762939453px; list-style-type: square; margin: 0.3em 0px 0px 1.6em; padding: 0px; list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAANAQMAAABb8jbLAAAABlBMVEX///8AUow5QSOjAAAAAXRSTlMAQObYZgAAABNJREFUCB1jYEABBQw/wLCAgQEAGpIDyT0IVcsAAAAASUVORK5CYII=); font-family: sans-serif; font-size: 13px; background-color: #ffffff; "><li style="margin-bottom: 0.1em; ">represents leaf objects in the composition .</li><li style="margin-bottom: 0.1em; ">implements all Component methods</li></ul><dl style="margin-top: 0.2em; margin-bottom: 0.5em; font-family: sans-serif; font-size: 13px; line-height: 19.200000762939453px; background-color: #ffffff; "><dt style="font-weight: bold; margin-bottom: 0.1em; ">Composite</dt></dl><ul style="line-height: 19.200000762939453px; list-style-type: square; margin: 0.3em 0px 0px 1.6em; padding: 0px; list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAANAQMAAABb8jbLAAAABlBMVEX///8AUow5QSOjAAAAAXRSTlMAQObYZgAAABNJREFUCB1jYEABBQw/wLCAgQEAGpIDyT0IVcsAAAAASUVORK5CYII=); font-family: sans-serif; font-size: 13px; background-color: #ffffff; "><li style="margin-bottom: 0.1em; ">represents a composite Component (component having children)</li><li style="margin-bottom: 0.1em; ">implements methods to manipulate children</li><li style="margin-bottom: 0.1em; ">implements all Component methods, generally by delegating them to its children<br /><br /><div style="background-color: #eeeeee; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.ArrayList;<br />&nbsp;<br /><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;"Component"&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">interface</span>&nbsp;Graphic&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Prints&nbsp;the&nbsp;graphic.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print();<br />}<br />&nbsp;<br /><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;"Composite"&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">class</span>&nbsp;CompositeGraphic&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Graphic&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Collection&nbsp;of&nbsp;child&nbsp;graphics.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;List&lt;Graphic&gt;&nbsp;childGraphics&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;Graphic&gt;();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Prints&nbsp;the&nbsp;graphic.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Graphic&nbsp;graphic&nbsp;:&nbsp;childGraphics)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphic.print();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Adds&nbsp;the&nbsp;graphic&nbsp;to&nbsp;the&nbsp;composition.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;add(Graphic&nbsp;graphic)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;childGraphics.add(graphic);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Removes&nbsp;the&nbsp;graphic&nbsp;from&nbsp;the&nbsp;composition.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;remove(Graphic&nbsp;graphic)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;childGraphics.remove(graphic);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;"Leaf"&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">class</span>&nbsp;Ellipse&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Graphic&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Prints&nbsp;the&nbsp;graphic.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Ellipse");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;<br /><span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;Client&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Program&nbsp;{<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Initialize&nbsp;four&nbsp;ellipses</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ellipse&nbsp;ellipse1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Ellipse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ellipse&nbsp;ellipse2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Ellipse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ellipse&nbsp;ellipse3&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Ellipse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ellipse&nbsp;ellipse4&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Ellipse();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Initialize&nbsp;three&nbsp;composite&nbsp;graphics</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompositeGraphic&nbsp;graphic&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CompositeGraphic();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompositeGraphic&nbsp;graphic1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CompositeGraphic();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompositeGraphic&nbsp;graphic2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CompositeGraphic();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Composes&nbsp;the&nbsp;graphics</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphic1.add(ellipse1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphic1.add(ellipse2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphic1.add(ellipse3);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphic2.add(ellipse4);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphic.add(graphic1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphic.add(graphic2);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">Prints&nbsp;the&nbsp;complete&nbsp;graphic&nbsp;(four&nbsp;times&nbsp;the&nbsp;string&nbsp;"Ellipse").</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graphic.print();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></li></ul><img src ="http://www.blogjava.net/czihong/aggbug/390627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-11-01 17:10 <a href="http://www.blogjava.net/czihong/articles/390627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Five: Bridge Design Pattern</title><link>http://www.blogjava.net/czihong/articles/390620.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Thu, 01 Nov 2012 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390620.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390620.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390620.html</trackback:ping><description><![CDATA[<div>&#8220;Decouple an abstraction from its implementation so that the two can vary independently&#8221; is the intent for bridge design pattern as stated by GoF.</div>
<div>Bridge design pattern is a modified version of the notion of &#8220;prefer composition over inheritance&#8221;.</div>
<div>Problem and Need for Bridge Design Pattern</div>
<div></div>
<div>When there are inheritance hierarchies creating concrete implementation, you loose flexibility because of interdependence. Oops! these kind of sentencies shows that the author(I) didn&#8217;t understand and tries to escape! Okay, I will decrypt this sentence in the coming paragraphs.</div>
<div>Decouple implentation from interface and hiding implementation details from client is the essense of bridge design pattern.</div>
<div>Elements of Bridge Design Pattern</div>
<div></div>
<div>Abstraction &#8211; core of the bridge design pattern and defines the crux. Contains a reference to the implementer.</div>
<div>Refined Abstraction &#8211; Extends the abstraction takes the finer detail one level below. Hides the finer elements from implemetors.</div>
<div>Implementer - This interface is the higer level than abstraction. Just defines the basic operations.</div>
<div>Concrete Implementation &#8211; Implements the above implementer by providing concrete implementation.</div>
<div>Example for core elements of Bridge Design Pattern</div>
<div></div>
<div>Vehicle -&gt; Abstraction</div>
<div>manufacture()</div>
<div>Car -&gt; Refined Abstraction 1</div>
<div>manufacture()</div>
<div>Bike -&gt; Refined Abstraction 2</div>
<div>manufacture()</div>
<div>Workshop -&gt; Implementor</div>
<div>work()</div>
<div>Produce -&gt; Concrete Implementation 1</div>
<div>work()</div>
<div>Assemble -&gt; Concrete Implementation 2</div>
<div>work()</div>
<div>Generic UML Diagram for Bridge Design Pattern</div>
<div></div>
<div></div>
<div>Before Bridge Design Pattern</div>
<div></div>
<div></div>
<div>After Bridge Design Pattern</div>
<div></div>
<div></div>
<div>Sample Java Code for Bridge Design Pattern</div>
<div></div>
<div>package com.javapapers.designpattern;</div>
<div>&nbsp;</div>
<div>/**</div>
<div>&nbsp;* abstraction in bridge pattern</div>
<div>&nbsp;* */</div>
<div>abstract class Vehicle {</div>
<div>&nbsp; protected Workshop workShop1;</div>
<div>&nbsp; protected Workshop workShop2;</div>
<div>&nbsp;</div>
<div>&nbsp; protected Vehicle(Workshop workShop1, Workshop workShop2) {</div>
<div>&nbsp; &nbsp; this.workShop1 = workShop1;</div>
<div>&nbsp; &nbsp; this.workShop2 = workShop2;</div>
<div>&nbsp; }</div>
<div>&nbsp;</div>
<div>&nbsp; abstract public void manufacture();</div>
<div>}</div>
<div>&nbsp;</div>
<div>package com.javapapers.designpattern;</div>
<div>&nbsp;</div>
<div>/**</div>
<div>&nbsp;* Refine abstraction 1 in bridge pattern</div>
<div>&nbsp;*/</div>
<div>public class Car extends Vehicle {</div>
<div>&nbsp;</div>
<div>&nbsp; public Car(Workshop workShop1, Workshop workShop2) {</div>
<div>&nbsp; &nbsp; super(workShop1, workShop2);</div>
<div>&nbsp; }</div>
<div>&nbsp;</div>
<div>&nbsp; @Override</div>
<div>&nbsp; public void manufacture() {</div>
<div>&nbsp; &nbsp; System.out.print("Car ");</div>
<div>&nbsp; &nbsp; workShop1.work();</div>
<div>&nbsp; &nbsp; workShop2.work();</div>
<div>&nbsp;</div>
<div>&nbsp; }</div>
<div>&nbsp;</div>
<div>}</div>
<div>&nbsp;</div>
<div>package com.javapapers.designpattern;</div>
<div>&nbsp;</div>
<div>/**</div>
<div>&nbsp;* Refine abstraction 2 in bridge pattern</div>
<div>&nbsp;*/</div>
<div>public class Bike extends Vehicle {</div>
<div>&nbsp;</div>
<div>&nbsp; public Bike(Workshop workShop1, Workshop workShop2) {</div>
<div>&nbsp; &nbsp; super(workShop1, workShop2);</div>
<div>&nbsp; }</div>
<div>&nbsp;</div>
<div>&nbsp; @Override</div>
<div>&nbsp; public void manufacture() {</div>
<div>&nbsp; &nbsp; System.out.print("Bike ");</div>
<div>&nbsp; &nbsp; workShop1.work();</div>
<div>&nbsp; &nbsp; workShop2.work();</div>
<div>&nbsp; }</div>
<div>&nbsp;</div>
<div>}</div>
<div>&nbsp;</div>
<div>package com.javapapers.designpattern;</div>
<div>&nbsp;</div>
<div>/**</div>
<div>&nbsp;* Implementor for bridge pattern</div>
<div>&nbsp;* */</div>
<div>public interface Workshop {</div>
<div>&nbsp; abstract public void work();</div>
<div>}</div>
<div>&nbsp;</div>
<div>package com.javapapers.designpattern;</div>
<div>&nbsp;</div>
<div>/**</div>
<div>&nbsp;* Concrete implementation 1 for bridge pattern</div>
<div>&nbsp;* */</div>
<div>public class Produce implements Workshop {</div>
<div>&nbsp;</div>
<div>&nbsp; @Override</div>
<div>&nbsp; public void work() {</div>
<div>&nbsp; &nbsp; System.out.print("Produced");</div>
<div>&nbsp; }</div>
<div>&nbsp;</div>
<div>}</div>
<div>&nbsp;</div>
<div>package com.javapapers.designpattern;</div>
<div>&nbsp;</div>
<div>/**</div>
<div>&nbsp;* Concrete implementation 2 for bridge pattern</div>
<div>&nbsp;* */</div>
<div>public class Assemble implements Workshop {</div>
<div>&nbsp;</div>
<div>&nbsp; @Override</div>
<div>&nbsp; public void work() {</div>
<div>&nbsp; &nbsp; System.out.println(" Assembled.");</div>
<div>&nbsp; }</div>
<div>&nbsp;</div>
<div>}</div>
<div>&nbsp;</div>
<div>package com.javapapers.designpattern;</div>
<div>&nbsp;</div>
<div>/*</div>
<div>&nbsp;* Demonstration of bridge design pattern</div>
<div>&nbsp;*/</div>
<div>public class BridgePattern {</div>
<div>&nbsp;</div>
<div>&nbsp; public static void main(String[] args) {</div>
<div>&nbsp;</div>
<div>&nbsp; &nbsp; Vehicle vehicle1 = new Car(new Produce(), new Assemble());</div>
<div>&nbsp; &nbsp; vehicle1.manufacture();</div>
<div>&nbsp; &nbsp; Vehicle vehicle2 = new Bike(new Produce(), new Assemble());</div>
<div>&nbsp; &nbsp; vehicle2.manufacture();</div>
<div>&nbsp;</div>
<div>&nbsp; }</div>
<div>}</div>
<div>&nbsp;</div>
<div>Output:</div>
<div>Car Produced Assembled.</div>
<div>Bike Produced Assembled.</div>
<div></div>
<div>Summary of Bridge Design Pattern</div>
<div></div>
<div>Creates two different hierarchies. One for abstraction and another for implementation.</div>
<div>Avoids permanent binding by removing the dependency between abstraction and implementation.</div>
<div>We create a bridge that coordinates between abstraction and implementation.</div>
<div>Abstraction and implementation can be extended separately.</div>
<div>Should be used when we have need to switch implementation at runtime.</div>
<div>Client should not be impacted if there is modification in implementation of abstraction.</div>
<div>Best used when you have multiple implementations.</div>
<div>Bridge Vs Adapter Design Pattern</div>
<div></div>
<div>The adapter design pattern helps it two incompatible classes to work together. But, bridge design pattern decouples the abstraction and implementation by creating two different hierarchies.</div><img src ="http://www.blogjava.net/czihong/aggbug/390620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-11-01 16:00 <a href="http://www.blogjava.net/czihong/articles/390620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Four: Flyweight Pattern</title><link>http://www.blogjava.net/czihong/articles/390463.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Tue, 30 Oct 2012 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390463.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390463.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390463.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390463.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390463.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">运用共享技术有效地支持大量细粒度的对象，系统只使用少量的对象，而这些对象都相近，状态变化很小，对象使用次数增多。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　UML类图如下：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　<img src="http://pic002.cnblogs.com/images/2010/165685/2010110822020085.gif" alt="" style="border: 0px; " /></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　其中类和对象的关系：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　1. Flyweight(抽象轻量级类)：声明一个接口，通过它可以接受外来的参数(状态)，并对新状态做出出来(作用)。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　2. ConcreteFlyweight(具体轻量级类)：实现Flyweight的接口，并为内部状态增加存储空间，ConcreteFlyweight对象必须是可以共享的，它所有存储的状态必须是内部的，它独立存在于自己的环境中。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　3. UnsharedConcreteFlyweight(不共享具体轻量级类)：不是所有的Flyweight子类都需要包儿共享，Flyweight的共享不是强制的。在某些Flyweight的结构层次中，UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　4. FlyweightFactory(轻量级类工厂)：创建并管理flyweight对象；确保享用flyweight。当用户请求一个flyweight时，FlyweightFactory提供一个已创建的实例或者创建一个实例。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　5. Client(客户应用程序)：维持一个对flyweight的引用；计算或存储一个或多个flyweight的外部状态。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　典型应用的顺序图如图：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　<img src="http://pic002.cnblogs.com/images/2010/165685/2010110822021142.gif" alt="" style="border: 0px; " /></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　客户初次从轻量级类工厂取flyweight时，轻量级类工厂创建一个新的具体flyweight对象，并且保存起来，下次客户取用时，就不用重新创建，直接在保存池中返回。客户负责处理flyweight的状态。</p><ul style="margin-left: 45px; font-family: Arial; line-height: 25px; background-color: #ffffff; "><li style="list-style: inherit; "><h2>实例1&#8212;&#8212;文档编辑器</h2></li></ul><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　潜在的，每个字符都被大量的采用，因此共享这些字符对象将会节省大量的存储空间。文档编辑器的UML类图如下：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　<img src="http://pic002.cnblogs.com/images/2010/165685/2010110822102243.gif" alt="" style="border: 0px; " /></p><div style="font-size: 12px; margin: 5px 0px; line-height: 25px; "><img id="code_img_opened_9c10a577-61fe-4ff7-99a3-ec8e42253671" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" style="border: 0px; " /><span style="line-height: 1.5; ">代码</span><div id="cnblogs_code_open_9c10a577-61fe-4ff7-99a3-ec8e42253671"><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="" title="复制代码" style="color: #1d58d1; text-decoration: none; border: none !important; "><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important; " /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; margin-left: 22px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New'; "> <span style="line-height: 1.5; color: #008000; ">//</span><span style="line-height: 1.5; color: #008000; ">Flyweight工厂</span><span style="line-height: 1.5; color: #008000; "><br /></span> <span style="line-height: 1.5; color: #0000ff; ">class</span><span style="line-height: 1.5; "> CharacterFactotry<br />    {<br />        </span><span style="line-height: 1.5; color: #0000ff; ">private</span><span style="line-height: 1.5; "> Hashtable characters </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #0000ff; ">new</span><span style="line-height: 1.5; "> Hashtable();<br />        </span><span style="line-height: 1.5; color: #0000ff; ">public</span><span style="line-height: 1.5; "> Character GetCharacter(</span><span style="line-height: 1.5; color: #0000ff; ">char</span><span style="line-height: 1.5; "> key)<br />        {<br />            </span><span style="line-height: 1.5; color: #008000; ">//</span><span style="line-height: 1.5; color: #008000; ">在初始化的Hashtable中取出字符</span><span style="line-height: 1.5; color: #008000; "><br /></span><span style="line-height: 1.5; ">            Character character </span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; "> (Character)characters[key];<br />            </span><span style="line-height: 1.5; color: #008000; ">//</span><span style="line-height: 1.5; color: #008000; ">如果取出的字符为null，初始化它</span><span style="line-height: 1.5; color: #008000; "><br /></span> <span style="line-height: 1.5; color: #0000ff; ">if</span><span style="line-height: 1.5; "> (character </span><span style="line-height: 1.5; ">==</span> <span style="line-height: 1.5; color: #0000ff; ">null</span><span style="line-height: 1.5; ">)<br />            {<br />                </span><span style="line-height: 1.5; color: #0000ff; ">switch</span><span style="line-height: 1.5; "> (key)<br />                {<br />                    </span><span style="line-height: 1.5; color: #0000ff; ">case</span> <span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">A</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">:<br />                        character </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #0000ff; ">new</span><span style="line-height: 1.5; "> CharacterA();<br />                        </span><span style="line-height: 1.5; color: #0000ff; ">break</span><span style="line-height: 1.5; ">;<br />                    </span><span style="line-height: 1.5; color: #0000ff; ">case</span> <span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">B</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">:<br />                        character </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #0000ff; ">new</span><span style="line-height: 1.5; "> CharacterB();<br />                        </span><span style="line-height: 1.5; color: #0000ff; ">break</span><span style="line-height: 1.5; ">;<br />                    </span><span style="line-height: 1.5; color: #0000ff; ">case</span> <span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">Z</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">:<br />                        character </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #0000ff; ">new</span><span style="line-height: 1.5; "> CharacterZ();<br />                        </span><span style="line-height: 1.5; color: #0000ff; ">break</span><span style="line-height: 1.5; ">;<br />                }<br />                characters.Add(key, character);<br />            }<br />            </span><span style="line-height: 1.5; color: #0000ff; ">return</span><span style="line-height: 1.5; "> character;<br />        }<br />    }<br />    </span><span style="line-height: 1.5; color: #008000; ">//</span><span style="line-height: 1.5; color: #008000; ">Flyweight</span><span style="line-height: 1.5; color: #008000; "><br /></span> <span style="line-height: 1.5; color: #0000ff; ">abstract</span> <span style="line-height: 1.5; color: #0000ff; ">class</span><span style="line-height: 1.5; "> Character<br />    {<br />        </span><span style="line-height: 1.5; color: #0000ff; ">protected</span> <span style="line-height: 1.5; color: #0000ff; ">char</span><span style="line-height: 1.5; "> symbol;<br />        </span><span style="line-height: 1.5; color: #0000ff; ">protected</span> <span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> width;<br />        </span><span style="line-height: 1.5; color: #0000ff; ">protected</span> <span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> height;<br />        </span><span style="line-height: 1.5; color: #0000ff; ">protected</span> <span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> ascent;<br />        </span><span style="line-height: 1.5; color: #0000ff; ">protected</span> <span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> descent;<br />        </span><span style="line-height: 1.5; color: #0000ff; ">protected</span> <span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> pointSize;<br />        </span><span style="line-height: 1.5; color: #0000ff; ">public</span> <span style="line-height: 1.5; color: #0000ff; ">abstract</span> <span style="line-height: 1.5; color: #0000ff; ">void</span><span style="line-height: 1.5; "> Draw(</span><span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> pointSize);<br />    }<br />    </span><span style="line-height: 1.5; color: #0000ff; ">class</span><span style="line-height: 1.5; "> CharacterA : Character<br />    {<br />        </span><span style="line-height: 1.5; color: #0000ff; ">public</span><span style="line-height: 1.5; "> CharacterA()<br />        {<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.symbol </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">A</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.height </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">100</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.width </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">120</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.ascent </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">70</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.descent </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">0</span><span style="line-height: 1.5; ">;<br />        }<br />        </span><span style="line-height: 1.5; color: #0000ff; ">public</span> <span style="line-height: 1.5; color: #0000ff; ">override</span> <span style="line-height: 1.5; color: #0000ff; ">void</span><span style="line-height: 1.5; "> Draw(</span><span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> pointSize)<br />        {<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.pointSize </span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; "> pointSize;<br />            Console.WriteLine(</span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.symbol);<br />        }<br />    }<br />    </span><span style="line-height: 1.5; color: #0000ff; ">class</span><span style="line-height: 1.5; "> CharacterB : Character<br />    {<br />        </span><span style="line-height: 1.5; color: #0000ff; ">public</span><span style="line-height: 1.5; "> CharacterB()<br />        {<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.symbol </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">B</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.height </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">100</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.width </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">140</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.ascent </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">72</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.descent </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">0</span><span style="line-height: 1.5; ">;<br />        }<br />        </span><span style="line-height: 1.5; color: #0000ff; ">public</span> <span style="line-height: 1.5; color: #0000ff; ">override</span> <span style="line-height: 1.5; color: #0000ff; ">void</span><span style="line-height: 1.5; "> Draw(</span><span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> pointSize)<br />        {<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.pointSize </span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; "> pointSize;<br />            Console.WriteLine(</span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.symbol);<br />        }<br />    }<br />    </span><span style="line-height: 1.5; color: #0000ff; ">class</span><span style="line-height: 1.5; "> CharacterZ : Character<br />    {<br />        </span><span style="line-height: 1.5; color: #0000ff; ">public</span><span style="line-height: 1.5; "> CharacterZ()<br />        {<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.symbol </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">Z</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.height </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">100</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.width </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">100</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.ascent </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">68</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.descent </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">0</span><span style="line-height: 1.5; ">;<br />        }<br />        </span><span style="line-height: 1.5; color: #0000ff; ">public</span> <span style="line-height: 1.5; color: #0000ff; ">override</span> <span style="line-height: 1.5; color: #0000ff; ">void</span><span style="line-height: 1.5; "> Draw(</span><span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> pointSize)<br />        {<br />            </span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.pointSize </span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; "> pointSize;<br />            Console.WriteLine(</span><span style="line-height: 1.5; color: #0000ff; ">this</span><span style="line-height: 1.5; ">.symbol);<br />        }<br />    }<br /><br /><br />    </span><span style="line-height: 1.5; color: #008000; ">//</span><span style="line-height: 1.5; color: #008000; ">客户应用测试</span><span style="line-height: 1.5; color: #008000; "><br /></span> <span style="line-height: 1.5; color: #0000ff; ">class</span><span style="line-height: 1.5; "> Client<br />    {<br />        [STAThread]<br />        </span><span style="line-height: 1.5; color: #0000ff; ">static</span> <span style="line-height: 1.5; color: #0000ff; ">void</span><span style="line-height: 1.5; "> Main(</span><span style="line-height: 1.5; color: #0000ff; ">string</span><span style="line-height: 1.5; ">[] args)<br />        {<br />            </span><span style="line-height: 1.5; color: #008000; ">//</span><span style="line-height: 1.5; color: #008000; ">用字符数组创造document</span><span style="line-height: 1.5; color: #008000; "><br /></span> <span style="line-height: 1.5; color: #0000ff; ">char</span><span style="line-height: 1.5; ">[] document </span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; "> { </span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">A</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">, </span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">B</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">, </span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">Z</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">, </span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">Z</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">, </span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">A</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; ">, </span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; color: #800000; ">A</span><span style="line-height: 1.5; color: #800000; ">'</span><span style="line-height: 1.5; "> };<br />            CharacterFactotry f </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #0000ff; ">new</span><span style="line-height: 1.5; "> CharacterFactotry();<br />            </span><span style="line-height: 1.5; color: #008000; ">//</span><span style="line-height: 1.5; color: #008000; ">外部状态</span><span style="line-height: 1.5; color: #008000; "><br /></span> <span style="line-height: 1.5; color: #0000ff; ">int</span><span style="line-height: 1.5; "> pointSize </span><span style="line-height: 1.5; ">=</span> <span style="line-height: 1.5; color: #800080; ">12</span><span style="line-height: 1.5; ">;<br />            </span><span style="line-height: 1.5; color: #008000; ">//</span><span style="line-height: 1.5; color: #008000; ">为每一个字符使用一个flyweight对象</span><span style="line-height: 1.5; color: #008000; "><br /></span> <span style="line-height: 1.5; color: #0000ff; ">foreach</span><span style="line-height: 1.5; "> (</span><span style="line-height: 1.5; color: #0000ff; ">char</span><span style="line-height: 1.5; "> c </span><span style="line-height: 1.5; color: #0000ff; ">in</span><span style="line-height: 1.5; "> document)<br />            {<br />                Character character </span><span style="line-height: 1.5; ">=</span><span style="line-height: 1.5; "> f.GetCharacter(c);<br />                character.Draw(pointSize);<br />            }<br />            Console.Read();<br />        }<br />    }</span></pre><div style="margin-top: 5px; "><span style="padding-right: 5px; line-height: 1.5; "><a href="" title="复制代码" style="color: #1d58d1; text-decoration: none; border: none !important; "><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="border: none !important; " /></a></span></div></div></div><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">&nbsp;</p><ul style="margin-left: 45px; font-family: Arial; line-height: 25px; background-color: #ffffff; "><li style="list-style: inherit; "><h2>优势和缺陷</h2></li></ul><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　Flyweight模式需要你认真考虑如何能细化对象，以减少处理的对象数量，从而减少存留对象在内存或其他存储设备中的占用量。然而，此模式需要维护大量对象的外部状态，如果外部状态的数据量大，传递、查找、计算这些恶数据会变得非常复杂。当外部和内部的状态很难分清时，不宜采用flyweight模式。</p><ul style="margin-left: 45px; font-family: Arial; line-height: 25px; background-color: #ffffff; "><li style="list-style: inherit; "><h2>应用情景</h2></li></ul><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　下面的情景很适合应用轻量级模式：</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　1. 系统需要存在大量的对象而共享某些本质的、不变的信息。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　2. 对象可以同时用于多个环境下。</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Arial; line-height: 25px; background-color: #ffffff; ">　　3. 在每个实例下，flyweight可以作为一个独立的对象。</p><img src ="http://www.blogjava.net/czihong/aggbug/390463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-10-30 15:08 <a href="http://www.blogjava.net/czihong/articles/390463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Three: Prototype Design</title><link>http://www.blogjava.net/czihong/articles/390269.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Fri, 26 Oct 2012 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/390269.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/390269.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/390269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/390269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/390269.html</trackback:ping><description><![CDATA[<h2>Prototype Definition</h2><div style="color: #777777; font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: #ffffff; "><p style="margin: 0px 0px 12px; ">Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.</p></div><a name="N1002B" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><a name="classdiagram" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><h2>Class Diagram</h2><div style="color: #777777; font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: #ffffff; "><p style="margin: 0px 0px 12px; "><img alt="Builder" src="http://apwebco.com/images/Prototype.jpg" /></p></div><a name="N10037" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><a name="participants" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><h2>Participants</h2><div style="color: #777777; font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: #ffffff; "><ul style="padding: 0px; margin: 10px; "><li><strong>Prototype</strong><ul style="padding: 0px; margin: 10px; "><li>declares an interface for cloning itself.</li></ul></li><li><strong>ConcretePrototype.</strong><ul style="padding: 0px; margin: 10px; "><li>implements an operation for cloning itself.</li></ul></li><li><strong>Client.</strong><ul style="padding: 0px; margin: 10px; "><li>creates a new object by asking a prototype to clone itself.</li></ul></li></ul></div><a name="N10062" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><a name="example" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><h2>Example: Product Cache</h2><div style="color: #777777; font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: #ffffff; "><p style="margin: 0px 0px 12px; ">When object instantiation is a lot more expensive than cloning, Prototype pattern may offer a useful optimization technique.</p><p style="margin: 0px 0px 12px; ">Example assumptions:</p><ul style="padding: 0px; margin: 10px; "><li>An e-commerce application gathers product information trough complex queries against a legacy database.</li><li>The legacy database is updated at predefined intervals which are known.</li><li>The number of products allows caching with a reasonable memory consumption.</li></ul><p style="margin: 0px 0px 12px; ">When a user asks for information for a certain product the application could gather that information in two ways:</p><ol><li>execute the complex query against legacy database, gather the information, and instantiate the object.</li><li>instantiate the objects at predefined intervals and keep them in a cache, when an object is requested, it is retrieved from cache and cloned. When the legacy database is updated, discard the content of the cache and re-load with new objects.</li></ol><p style="margin: 0px 0px 12px; ">The second approach is based on Prototype pattern and it is illustrated below:</p></div><a name="N1008A" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><a name="example_diagram" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><h2>Example: Class Diagram</h2><div style="color: #777777; font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: #ffffff; "><p style="margin: 0px 0px 12px; "><img alt="Prototype Example" src="http://apwebco.com/images/PrototypeExample.png" /></p></div><a name="N10096" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><a name="example_Java" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><h2>Example: Java sample code</h2><div style="font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: #ffffff; "><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">abstract</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">class</span><span style="color: #000000; ">&nbsp;Product&nbsp;</span><span style="color: #0000ff; ">implements</span><span style="color: #000000; ">&nbsp;Cloneable&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;SKU;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;description;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;Object&nbsp;clone()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;clone&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">null</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clone&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">super</span><span style="color: #000000; ">.clone();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff; ">catch</span><span style="color: #000000; ">&nbsp;(CloneNotSupportedException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">return</span><span style="color: #000000; ">&nbsp;clone;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;getDescription()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">return</span><span style="color: #000000; ">&nbsp;description;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;getSKU()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">return</span><span style="color: #000000; ">&nbsp;SKU;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">void</span><span style="color: #000000; ">&nbsp;setDescription(String&nbsp;string)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;string;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">void</span><span style="color: #000000; ">&nbsp;setSKU(String&nbsp;string)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SKU&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;string;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">class</span><span style="color: #000000; ">&nbsp;Book&nbsp;</span><span style="color: #0000ff; ">extends</span><span style="color: #000000; ">&nbsp;Product&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;numberOfPages;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;getNumberOfPages()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">return</span><span style="color: #000000; ">&nbsp;numberOfPages;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">void</span><span style="color: #000000; ">&nbsp;setNumberOfPages(</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numberOfPages&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">class</span><span style="color: #000000; ">&nbsp;DVD&nbsp;</span><span style="color: #0000ff; ">extends</span><span style="color: #000000; ">&nbsp;Product&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;duration;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;getDuration()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">return</span><span style="color: #000000; ">&nbsp;duration;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">void</span><span style="color: #000000; ">&nbsp;setDuration(</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;duration&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">import</span><span style="color: #000000; ">&nbsp;java.util.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">class</span><span style="color: #000000; ">&nbsp;ProductCache&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">static</span><span style="color: #000000; ">&nbsp;Hashtable&nbsp;productMap&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">new</span><span style="color: #000000; ">&nbsp;Hashtable();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">static</span><span style="color: #000000; ">&nbsp;Product&nbsp;getProduct(String&nbsp;productCode)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Product&nbsp;cachedProduct&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Product)&nbsp;productMap.get(productCode);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">return</span><span style="color: #000000; ">&nbsp;(Product)&nbsp;cachedProduct.clone();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">void</span><span style="color: #000000; ">&nbsp;loadCache()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;for&nbsp;each&nbsp;product&nbsp;run&nbsp;expensive&nbsp;query&nbsp;and&nbsp;instantiate&nbsp;product<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;productMap.put(productKey,&nbsp;product);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;for&nbsp;exemplification,&nbsp;we&nbsp;add&nbsp;only&nbsp;two&nbsp;products</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;b1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">new</span><span style="color: #000000; ">&nbsp;Book();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b1.setDescription(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Oliver&nbsp;Twist</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b1.setSKU(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">B1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b1.setNumberOfPages(</span><span style="color: #000000; ">100</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;productMap.put(b1.getSKU(),&nbsp;b1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DVD&nbsp;d1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">new</span><span style="color: #000000; ">&nbsp;DVD();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d1.setDescription(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Superman</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d1.setSKU(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">D1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d1.setDuration(</span><span style="color: #000000; ">180</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;productMap.put(d1.getSKU(),&nbsp;d1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">class</span><span style="color: #000000; ">&nbsp;Application&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000ff; ">void</span><span style="color: #000000; ">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProductCache.loadCache();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Book&nbsp;clonedBook&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Book)&nbsp;ProductCache.getProduct(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">B1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SKU&nbsp;=&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;clonedBook.getSKU());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SKU&nbsp;=&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;clonedBook.getDescription());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SKU&nbsp;=&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;clonedBook.getNumberOfPages());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DVD&nbsp;clonedDVD&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(DVD)&nbsp;ProductCache.getProduct(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">D1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SKU&nbsp;=&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;clonedDVD.getSKU());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SKU&nbsp;=&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;clonedDVD.getDescription());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SKU&nbsp;=&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;clonedDVD.getDuration());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></div><h2>Benefits</h2><div style="color: #777777; font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: #ffffff; "><ul style="padding: 0px; margin: 10px; "><li>Adding and removing products at runtime.</li><li>Specifying new objects by varying values.</li><li>Specifying new objects by varying structure.</li><li>Reduced subclassing.</li><li>Configuring an application with classes dinamincally.</li></ul></div><a name="N100BA" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><a name="usage" style="color: rgb(51, 102, 204); font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); "></a><h2>Usage</h2><div style="color: #777777; font-family: Arial, Verdana, Univers; font-size: 12px; line-height: normal; background-color: #ffffff; "><ul style="padding: 0px; margin: 10px; "><li>When the classes to instantiate are specified at run time.</li><li>When you want to avoid building a class hierarchy of factories that parallels the class hierarchy of products.</li><li>When instances of a class can have one of only a few combinations of state.</li></ul></div><img src ="http://www.blogjava.net/czihong/aggbug/390269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-10-26 14:30 <a href="http://www.blogjava.net/czihong/articles/390269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Two: Strategy pattern</title><link>http://www.blogjava.net/czihong/articles/381473.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Mon, 25 Jun 2012 21:31:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/381473.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/381473.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/381473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/381473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/381473.html</trackback:ping><description><![CDATA[<p align="left"><strong><span style="font-size: 24pt; font-family: Verdana, sans-serif;">Strategy pattern</span></strong></p>  <p align="left" style="line-height: 18pt;">&nbsp;</p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">In&nbsp;<a href="http://en.wikipedia.org/wiki/Computer_programming" title="Computer programming"><span style="color:#0B0080">computer programming</span></a>, the&nbsp;<strong>strategy pattern</strong>&nbsp;(also known as the&nbsp;<strong>policy pattern</strong>) is a particular&nbsp;<a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)" title="Design pattern (computer science)"><span style=" color:#0B0080">software design pattern</span></a>, whereby&nbsp;<a href="http://en.wikipedia.org/wiki/Algorithm" title="Algorithm"><span style="color:#0B0080">algorithms</span></a>&nbsp;can be selected at runtime. Formally speaking, the strategy pattern defines a family of&nbsp;<a href="http://en.wikipedia.org/wiki/Algorithm" title="Algorithm"><span style="color:#0B0080">algorithms</span></a>, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.<sup><a href="http://en.wikipedia.org/wiki/Strategy_Pattern#cite_note-0"><span style="color:#0B0080">[1]</span></a></sup></span></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">For instance, a class that performs validation on incoming data may use a strategy pattern to select a validation algorithm based on the type of data, the source of the data, user choice, and/or other discriminating factors. These factors are not known for each case until run-time, and may require radically different validation to be performed. The validation strategies, encapsulated separately from the validating object, may be used by other validating objects in different areas of the system (or even different systems) without code duplication.</span></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">The essential requirement in the&nbsp;<a href="http://en.wikipedia.org/wiki/Programming_language" title="Programming language"><span style="color:#0B0080">programming language</span></a>&nbsp;is the ability to store a reference to some code in a data structure and retrieve it. This can be achieved by mechanisms such as the native&nbsp;<a href="http://en.wikipedia.org/wiki/Function_pointer" title="Function pointer"><span style="color:#0B0080">function pointer</span></a>, the&nbsp;<a href="http://en.wikipedia.org/wiki/First-class_function" title="First-class function"><span style="color:#0B0080">first-class function</span></a>, classes or class instances in&nbsp;<a href="http://en.wikipedia.org/wiki/Object-oriented_programming" title="Object-oriented programming"><span style=" color:#0B0080">object-oriented programming</span></a>&nbsp;languages, or accessing the language implementation's internal storage of code via&nbsp;<a href="http://en.wikipedia.org/wiki/Reflection_(computer_science)" title="Reflection (computer science)"><span style=" color:#0B0080">reflection</span></a>.</span></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><br /></p>  <p align="left" style="line-height: 18pt;"><strong><span style="font-size: 7pt; font-family: Arial, sans-serif;">Example</span></strong></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">The following example is in&nbsp;<a href="http://en.wikipedia.org/wiki/Java_(programming_language)" title="Java (programming language)"><span style=" color:#0B0080">Java</span></a>.</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><em><span style="font-size: 7.0pt;font-family:宋体;color:#666666;">// The classes that implement a concrete strategy should implement this.</span></em> <em><span style="font-size: 7.0pt;font-family:宋体;color:#666666;">// The Context class uses this to call the concrete strategy.</span></em> </p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><strong><span style="font-size: 7pt; font-family: 宋体;">interface</span></strong><span style="font-size: 7pt; font-family: 宋体;"> Strategy </span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size:7.0pt;font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> execute</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">(</span><strong><span style="font-size:7.0pt;font-family:宋体; color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> a, </span><strong><span style="font-size:7.0pt; font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> b</span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">)</span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;<span style="font-size: 7.0pt;font-family:宋体;color:#009900;">}</span><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp; </span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><em><span style="font-size: 7.0pt;font-family:宋体;color:#666666;">// Implements the algorithm using the strategy interface</span></em> </p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><strong><span style="font-size: 7pt; font-family: 宋体;">class</span></strong><span style="font-size: 7pt; font-family: 宋体;"> ConcreteStrategyAdd <strong>implements</strong> Strategy </span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>public</strong> </span><strong><span style="font-size:7.0pt;font-family:宋体; color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> execute</span><span style="font-size:7.0pt; font-family:宋体;color:#009900;">(</span><strong><span style="font-size:7.0pt;font-family:宋体; color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> a, </span><strong><span style="font-size:7.0pt; font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> b</span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">)</span> <span style="font-size: 7.0pt;font-family:宋体;color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size:7.0pt;font-family:宋体;color:#003399;">System</span><span style="font-size: 7pt; font-family: 宋体;">.</span><span style="font-size:7.0pt;font-family:宋体; color:#006633;">out</span><span style="font-size: 7pt; font-family: 宋体;">.</span><span style="font-size:7.0pt; font-family:宋体;color:#006633;">println</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">(</span><span style="font-size: 7.0pt;font-family:宋体;color:blue;">"Called ConcreteStrategyAdd's execute()"</span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">)</span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong> a </span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">+</span><span style="font-size: 7pt; font-family: 宋体;"> b</span><span style="font-size:7.0pt;font-family:宋体; color:#339933;">;</span>&nbsp;</p>  <p align="left" style="text-indent: 17.5pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><em><span style="font-size: 7.0pt;font-family:宋体;color:#666666;">// Do an addition with a and b</span></em> </p>  <p align="left" style="text-indent: 17.5pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;<span style="font-size: 7.0pt;font-family:宋体;color:#009900;">}</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;<span style="font-size:7.0pt; font-family:宋体;color:#009900;">}</span><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp; </span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;</p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><strong><span style="font-size: 7pt; font-family: 宋体;">class</span></strong><span style="font-size: 7pt; font-family: 宋体;"> ConcreteStrategySubtract <strong>implements</strong> Strategy </span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>public</strong> </span><strong><span style="font-size:7.0pt;font-family:宋体; color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> execute</span><span style="font-size:7.0pt; font-family:宋体;color:#009900;">(</span><strong><span style="font-size:7.0pt;font-family:宋体; color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> a, </span><strong><span style="font-size:7.0pt; font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> b</span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">)</span> <span style="font-size: 7.0pt;font-family:宋体;color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size:7.0pt;font-family:宋体;color:#003399;">System</span><span style="font-size: 7pt; font-family: 宋体;">.</span><span style="font-size:7.0pt;font-family:宋体; color:#006633;">out</span><span style="font-size: 7pt; font-family: 宋体;">.</span><span style="font-size:7.0pt; font-family:宋体;color:#006633;">println</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">(</span><span style="font-size: 7.0pt;font-family:宋体;color:blue;">"Called ConcreteStrategySubtract's execute()"</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">)</span><span style="font-size:7.0pt; font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong> a </span><span style="font-size:7.0pt;font-family:宋体; color:#339933;">-</span><span style="font-size: 7pt; font-family: 宋体;"> b</span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="text-indent: 10.5pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;<em><span style="font-size: 7.0pt;font-family:宋体;color:#666666;">// Do a subtraction with a and b</span></em></p>  <p align="left" style="text-indent: 10.5pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">}</span></p>  <p align="left" style="text-indent: 10.5pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;<span style="font-size:7.0pt; font-family:宋体;color:#009900;">}</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><strong><span style="font-size: 7pt; font-family: 宋体;">class</span></strong><span style="font-size: 7pt; font-family: 宋体;"> ConcreteStrategyMultiply <strong>implements</strong> Strategy </span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>public</strong> </span><strong><span style="font-size:7.0pt;font-family:宋体; color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> execute</span><span style="font-size:7.0pt; font-family:宋体;color:#009900;">(</span><strong><span style="font-size:7.0pt;font-family:宋体; color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> a, </span><strong><span style="font-size:7.0pt; font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> b</span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">)</span> <span style="font-size: 7.0pt;font-family:宋体;color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size:7.0pt;font-family:宋体;color:#003399;">System</span><span style="font-size: 7pt; font-family: 宋体;">.</span><span style="font-size:7.0pt;font-family:宋体; color:#006633;">out</span><span style="font-size: 7pt; font-family: 宋体;">.</span><span style="font-size:7.0pt; font-family:宋体;color:#006633;">println</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">(</span><span style="font-size: 7.0pt;font-family:宋体;color:blue;">"Called ConcreteStrategyMultiply's execute()"</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">)</span><span style="font-size:7.0pt; font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong> a </span><span style="font-size:7.0pt;font-family:宋体; color:#339933;">*</span><span style="font-size: 7pt; font-family: 宋体;"> b</span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp; &nbsp;&nbsp;</span><em><span style="font-size:7.0pt;font-family:宋体; color:#666666;">// Do a multiplication with a and b</span></em> </p>  <p align="left" style="text-indent: 20.45pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size:7.0pt; font-family:宋体;color:#009900;">}</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size:7.0pt; font-family:宋体;color:#009900;">}</span><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp; </span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><em><span style="font-size: 7.0pt;font-family:宋体;color:#666666;">// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object</span></em> </p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><strong><span style="font-size: 7pt; font-family: 宋体;">class</span></strong> <span style="font-size: 7.0pt;font-family:宋体;color:#003399;">Context</span> <span style="font-size:7.0pt;font-family:宋体; color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>private</strong> Strategy strategy</span><span style="font-size:7.0pt;font-family:宋体; color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><em><span style="font-size:7.0pt;font-family:宋体;color:#666666;">// Constructor</span></em> </p>  <p align="left" style="text-indent: 7pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp; <strong>public</strong> </span><span style="font-size:7.0pt;font-family:宋体;color:#003399;">Context</span><span style="font-size:7.0pt; font-family:宋体;color:#009900;">(</span><span style="font-size: 7pt; font-family: 宋体;">Strategy strategy</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">)</span> <span style="font-size:7.0pt;font-family:宋体; color:#009900;">{</span></p>  <p align="left" style="text-indent: 7pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>this</strong>.</span><span style="font-size:7.0pt;font-family:宋体;color:#006633;">strategy</span> <span style="font-size:7.0pt;font-family:宋体; color:#339933;">=</span><span style="font-size: 7pt; font-family: 宋体;"> strategy</span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="text-indent: 7pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">}</span></p>  <p align="left" style="text-indent: 7pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;</p>  <p align="left" style="text-indent: 7pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; <strong>public</strong> </span><strong><span style="font-size:7.0pt;font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> executeStrategy</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">(</span><strong><span style="font-size:7.0pt;font-family:宋体; color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> a, </span><strong><span style="font-size:7.0pt; font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> b</span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">)</span> <span style="font-size: 7.0pt;font-family:宋体;color:#009900;">{</span></p>  <p align="left" style="text-indent: 7pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong> strategy.</span><span style="font-size:7.0pt;font-family:宋体; color:#006633;">execute</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">(</span><span style="font-size: 7pt; font-family: 宋体;">a, b</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">)</span><span style="font-size: 7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="text-indent: 7pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">}</span></p>  <p align="left" style="text-indent: 7pt; line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;<span style="font-size:7.0pt; font-family:宋体;color:#009900;">}</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;<em><span style="font-size: 7.0pt;font-family:宋体;color:#666666;">// Test application</span></em><span style="font-size: 7pt; font-family: 宋体;"> <strong>class</strong> StrategyExample </span><span style="font-size:7.0pt;font-family: 宋体;color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>public</strong> <strong>static</strong> </span><strong><span style="font-size:7.0pt;font-family:宋体; color:#000066;">void</span></strong><span style="font-size: 7pt; font-family: 宋体;"> main</span><span style="font-size:7.0pt; font-family:宋体;color:#009900;">(</span><span style="font-size:7.0pt;font-family:宋体; color:#003399;">String</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">[]</span><span style="font-size: 7pt; font-family: 宋体;"> args</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">)</span><span style="font-size: 7pt; font-family: 宋体;"> </span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">{</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size:7.0pt;font-family:宋体;color:#003399;">Context</span><span style="font-size: 7pt; font-family: 宋体;"> context</span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><em><span style="font-size:7.0pt;font-family:宋体;color:#666666;">// Three contexts following different strategies</span></em></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context </span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">=</span><span style="font-size: 7pt; font-family: 宋体;"> <strong>new</strong> </span><span style="font-size:7.0pt;font-family:宋体;color:#003399;">Context</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">(</span><strong><span style="font-size: 7pt; font-family: 宋体;">new</span></strong><span style="font-size: 7pt; font-family: 宋体;"> ConcreteStrategyAdd</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">())</span><span style="font-size:7.0pt; font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size:7.0pt;font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> resultA </span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">=</span><span style="font-size: 7pt; font-family: 宋体;"> context.</span><span style="font-size:7.0pt;font-family:宋体;color:#006633;">executeStrategy</span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">(</span><span style="font-size:7.0pt;font-family:宋体;color:#CC66CC;">3</span><span style="font-size: 7pt; font-family: 宋体;">,</span><span style="font-size:7.0pt; font-family:宋体;color:#CC66CC;">4</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">)</span><span style="font-size: 7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context </span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">=</span><span style="font-size: 7pt; font-family: 宋体;"> <strong>new</strong> </span><span style="font-size:7.0pt;font-family:宋体;color:#003399;">Context</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">(</span><strong><span style="font-size: 7pt; font-family: 宋体;">new</span></strong><span style="font-size: 7pt; font-family: 宋体;"> ConcreteStrategySubtract</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">())</span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size:7.0pt;font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> resultB </span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">=</span><span style="font-size: 7pt; font-family: 宋体;"> context.</span><span style="font-size:7.0pt;font-family:宋体;color:#006633;">executeStrategy</span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">(</span><span style="font-size:7.0pt;font-family:宋体;color:#CC66CC;">3</span><span style="font-size: 7pt; font-family: 宋体;">,</span><span style="font-size:7.0pt; font-family:宋体;color:#CC66CC;">4</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">)</span><span style="font-size: 7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context </span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">=</span><span style="font-size: 7pt; font-family: 宋体;"> <strong>new</strong> </span><span style="font-size:7.0pt;font-family:宋体;color:#003399;">Context</span><span style="font-size:7.0pt;font-family:宋体;color:#009900;">(</span><strong><span style="font-size: 7pt; font-family: 宋体;">new</span></strong><span style="font-size: 7pt; font-family: 宋体;"> ConcreteStrategyMultiply</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">())</span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size:7.0pt;font-family:宋体;color:#000066;">int</span></strong><span style="font-size: 7pt; font-family: 宋体;"> resultC </span><span style="font-size:7.0pt;font-family:宋体;color:#339933;">=</span><span style="font-size: 7pt; font-family: 宋体;"> context.</span><span style="font-size:7.0pt;font-family:宋体;color:#006633;">executeStrategy</span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">(</span><span style="font-size:7.0pt;font-family:宋体;color:#CC66CC;">3</span><span style="font-size: 7pt; font-family: 宋体;">,</span><span style="font-size:7.0pt; font-family:宋体;color:#CC66CC;">4</span><span style="font-size:7.0pt;font-family:宋体; color:#009900;">)</span><span style="font-size: 7.0pt;font-family:宋体;color:#339933;">;</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 7.0pt;font-family:宋体;color:#009900;">}</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;">&nbsp;<span style="font-size:7.0pt; font-family:宋体;color:#009900;">}</span> </p>  <p align="left" style="line-height: 18pt;"><strong><span style="font-size: 7pt; font-family: Arial, sans-serif;">Strategy versus Bridge</span></strong></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">The&nbsp;<a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language" title="Unified Modeling Language"><span style=" color:#0B0080">UML</span></a>&nbsp;class diagram for the strategy pattern is the same<sup>[<em><a href="http://en.wikipedia.org/wiki/Wikipedia:Please_clarify" title="Wikipedia:Please clarify"><span style=" color:#0B0080">further explanation needed</span></a></em>]</sup>&nbsp;as the diagram for the&nbsp;<a href="http://en.wikipedia.org/wiki/Bridge_pattern" title="Bridge pattern"><span style="color:#0B0080">Bridge pattern</span></a>. However, these two design patterns aren't the same in their&nbsp;<em>intent</em>. While the strategy pattern is meant for&nbsp;<em>behavior</em>, the Bridge pattern is meant for&nbsp;<em>structure</em>.</span></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">The coupling between the context and the strategies is tighter than the coupling between the abstraction and the implementation in the Bridge pattern.</span></p>  <p align="left" style="line-height: 18pt;"><strong><span style="font-size: 7pt; font-family: Arial, sans-serif;">Strategy and open/closed principle</span></strong></p>  <p align="center" style="text-align:center;line-height:18.0pt;background:#F9F9F9"><a href="http://en.wikipedia.org/wiki/File:StrategyPattern_IBrakeBehavior.svg"><span style="font-size:7.5pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#0B0080;text-decoration:none; text-underline:none"><img border="0" width="220" height="104" src="file:///C:/DOCUME~1/Chan/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.gif" alt="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/StrategyPattern_IBrakeBehavior.svg/220px-StrategyPattern_IBrakeBehavior.svg.png" v:shapes="Picture_x0020_18" /></span></a></p>  <p align="left" style="line-height: 16.8pt; background-color: #f9f9f9; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: Arial, sans-serif;"><a href="http://en.wikipedia.org/wiki/File:StrategyPattern_IBrakeBehavior.svg" title="Enlarge"><span style="color:#0B0080;text-decoration:none;text-underline: none"><img border="0" width="15" height="11" src="file:///C:/DOCUME~1/Chan/LOCALS~1/Temp/msohtmlclip1/01/clip_image003.gif" v:shapes="_x0000_i1027"  alt="" /></span></a></span></p>  <p align="left" style="line-height: 16.8pt; background-color: #f9f9f9; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">Accelerate and&nbsp;<a href="http://en.wikipedia.org/wiki/Brake" title="Brake"><span style="color:#0B0080">brake</span></a>&nbsp;behaviors must be declared in each new&nbsp;<a href="http://en.wikipedia.org/wiki/Car_model" title="Car model"><span style="color:#0B0080">car model</span></a></span></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">According to the strategy pattern, the behaviors of a class should not be inherited, instead they should be encapsulated using interfaces. As an example, consider a car class. Two possible functionalities for car are brake and accelerate.</span></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">Since accelerate and brake behaviors change frequently between models, a common approach is to implement these behaviors in subclasses. This approach has significant drawbacks: accelerate and brake behaviors must be declared in each new Car model. The work of managing these behaviors increases greatly as the number of models increases, and requires code to be duplicated across models. Additionally, it is not easy to determine the exact nature of the behavior for each model without investigating the code in each.</span></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">The strategy pattern uses aggregation instead of inheritance. In the strategy pattern behaviors are defined as separate interfaces and specific classes that implement these interfaces. Specific classes encapsulate these interfaces. This allows better decoupling between the behavior and the class that uses the behavior. The behavior can be changed without breaking the classes that use it, and the classes can switch between behaviors by changing the specific implementation used without requiring any significant code changes. Behaviors can also be changed at run-time as well as at design-time. For instance, a car object&#8217;s brake behavior can be changed from&nbsp;</span><span style="font-size: 12pt; font-family: 'Courier New';">BrakeWithABS()</span><span style="font-size: 7pt; font-family: Arial, sans-serif;">&nbsp;to&nbsp;</span><span style="font-size: 12pt; font-family: 'Courier New';">Brake()</span><span style="font-size: 7pt; font-family: Arial, sans-serif;">&nbsp;by changing the&nbsp;</span><span style="font-size: 12pt; font-family: 'Courier New';">brakeBehavior</span><span style="font-size: 7pt; font-family: Arial, sans-serif;">&nbsp;member to:</span></p>  <p align="left" style="line-height: 14.4pt; background-color: #f9f9f9; vertical-align: top; background-position: initial initial; background-repeat: initial initial;"><span style="font-size: 7pt; font-family: 宋体;">brakeBehavior </span><span style="font-size:7.0pt;font-family:宋体;color:navy;">=</span><span style="font-size: 7pt; font-family: 宋体;"> </span><span style="font-size:7.0pt;font-family:宋体;color:#0000DD;">new</span><span style="font-size: 7pt; font-family: 宋体;"> Brake</span><span style="font-size:7.0pt; font-family:宋体;color:green;">()</span><span style="font-size:7.0pt;font-family:宋体; color:teal;">;</span><span style="font-size: 7pt; font-family: 宋体;"> </span></p>  <p align="left" style="margin: 4.8pt 0cm 6pt; line-height: 18pt;"><span style="font-size: 7pt; font-family: Arial, sans-serif;">This gives greater flexibility in design and is in harmony with the&nbsp;<a href="http://en.wikipedia.org/wiki/Open/closed_principle" title="Open/closed principle"><span style=" color:#0B0080">Open/closed principle</span></a>&nbsp;(OCP) that states that classes should be open for extension but closed for modification.</span></p>  <p>&nbsp;</p><img src ="http://www.blogjava.net/czihong/aggbug/381473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-06-26 05:31 <a href="http://www.blogjava.net/czihong/articles/381473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>One: Decorator pattern</title><link>http://www.blogjava.net/czihong/articles/381472.html</link><dc:creator>明年今日</dc:creator><author>明年今日</author><pubDate>Mon, 25 Jun 2012 21:30:00 GMT</pubDate><guid>http://www.blogjava.net/czihong/articles/381472.html</guid><wfw:comment>http://www.blogjava.net/czihong/comments/381472.html</wfw:comment><comments>http://www.blogjava.net/czihong/articles/381472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/czihong/comments/commentRss/381472.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/czihong/services/trackbacks/381472.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: This pattern is designed so that multiple decorators can be stacked on top of each other, each time adding a new functionality to the overridden method(s). Introduction  The decorator pattern can be u...&nbsp;&nbsp;<a href='http://www.blogjava.net/czihong/articles/381472.html'>阅读全文</a><img src ="http://www.blogjava.net/czihong/aggbug/381472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/czihong/" target="_blank">明年今日</a> 2012-06-26 05:30 <a href="http://www.blogjava.net/czihong/articles/381472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>