﻿<?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-Java学习-随笔分类-Design Patterns</title><link>http://www.blogjava.net/flustar/category/25084.html</link><description>我们都随时处于正在学习的过程。</description><language>zh-cn</language><lastBuildDate>Tue, 29 Jan 2008 23:19:23 GMT</lastBuildDate><pubDate>Tue, 29 Jan 2008 23:19:23 GMT</pubDate><ttl>60</ttl><item><title>设计模式学习笔记(二十二)—FlyWeight享元模式</title><link>http://www.blogjava.net/flustar/archive/2008/01/26/flyw.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Sat, 26 Jan 2008 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2008/01/26/flyw.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/177903.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2008/01/26/flyw.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/177903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/177903.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之FlyWeight享元模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2008/01/26/flyw.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/177903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2008-01-26 13:45 <a href="http://www.blogjava.net/flustar/archive/2008/01/26/flyw.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(二十一)—Composite模式 </title><link>http://www.blogjava.net/flustar/archive/2007/12/18/composite.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Tue, 18 Dec 2007 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/18/composite.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/168537.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/18/composite.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/168537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/168537.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Composite模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/18/composite.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/168537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-18 17:10 <a href="http://www.blogjava.net/flustar/archive/2007/12/18/composite.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(二十)—Visitor访问者模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/15/visitor.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Sat, 15 Dec 2007 10:37:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/15/visitor.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/167985.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/15/visitor.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/167985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/167985.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Visitor模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/15/visitor.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/167985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-15 18:37 <a href="http://www.blogjava.net/flustar/archive/2007/12/15/visitor.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十九)—Chain of Responsibility职责链模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/14/cor.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Fri, 14 Dec 2007 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/14/cor.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/167780.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/14/cor.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/167780.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/167780.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Chain of Responsibility模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/14/cor.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/167780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-14 15:07 <a href="http://www.blogjava.net/flustar/archive/2007/12/14/cor.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十八)—Mediator中介者模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/12/mediator.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Wed, 12 Dec 2007 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/12/mediator.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/167324.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/12/mediator.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/167324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/167324.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Mediator模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/12/mediator.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/167324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-12 20:34 <a href="http://www.blogjava.net/flustar/archive/2007/12/12/mediator.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十七)—Memento备忘录模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/08/memento.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Sat, 08 Dec 2007 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/08/memento.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/166286.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/08/memento.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/166286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/166286.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Memento模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/08/memento.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/166286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-08 15:25 <a href="http://www.blogjava.net/flustar/archive/2007/12/08/memento.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十六)—Proxy模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/06/proxy.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Thu, 06 Dec 2007 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/06/proxy.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/165779.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/06/proxy.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/165779.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/165779.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Proxy模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/06/proxy.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/165779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-06 13:19 <a href="http://www.blogjava.net/flustar/archive/2007/12/06/proxy.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十五)—State模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/05/state.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Wed, 05 Dec 2007 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/05/state.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/165557.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/05/state.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/165557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/165557.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之state模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/05/state.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/165557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-05 16:35 <a href="http://www.blogjava.net/flustar/archive/2007/12/05/state.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十四)—Command模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/05/command.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Wed, 05 Dec 2007 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/05/command.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/165467.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/05/command.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/165467.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/165467.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Command模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/05/command.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/165467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-05 13:23 <a href="http://www.blogjava.net/flustar/archive/2007/12/05/command.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十三)—Iterator迭代器模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/04/iterator.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Tue, 04 Dec 2007 15:52:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/04/iterator.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/165343.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/04/iterator.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/165343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/165343.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Iterator模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/04/iterator.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/165343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-04 23:52 <a href="http://www.blogjava.net/flustar/archive/2007/12/04/iterator.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十二)—Builder建造者模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/03/builder.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Mon, 03 Dec 2007 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/03/builder.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/165013.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/03/builder.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/165013.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/165013.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Builder模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/03/builder.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/165013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-03 21:39 <a href="http://www.blogjava.net/flustar/archive/2007/12/03/builder.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十一)—Prototype原型模式</title><link>http://www.blogjava.net/flustar/archive/2007/12/02/prototype.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Sun, 02 Dec 2007 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/12/02/prototype.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/164650.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/12/02/prototype.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/164650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/164650.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Prototype模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/12/02/prototype.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/164650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-12-02 16:16 <a href="http://www.blogjava.net/flustar/archive/2007/12/02/prototype.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(十)—Factory Method模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/29/factoryMethod.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Thu, 29 Nov 2007 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/29/factoryMethod.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/164056.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/29/factoryMethod.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/164056.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/164056.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式之Factory Method模式&nbsp;&nbsp;<a href='http://www.blogjava.net/flustar/archive/2007/11/29/factoryMethod.html'>阅读全文</a><img src ="http://www.blogjava.net/flustar/aggbug/164056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-29 17:41 <a href="http://www.blogjava.net/flustar/archive/2007/11/29/factoryMethod.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(九)—Singleton模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/28/singleton.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Wed, 28 Nov 2007 12:39:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/28/singleton.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/163803.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/28/singleton.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/163803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/163803.html</trackback:ping><description><![CDATA[&nbsp;《设计模式》一书对Singleton模式是这样描述的：<br />
保证一个类只有一个实例，并提供一个访问它的全局访问点。<br />
这个模式比较简单，下面给出一个例子:<br />
public class Singleton {<br />
&nbsp; private static Singleton instance;<br />
&nbsp; private Singleton(){<br />
&nbsp;&nbsp; <br />
&nbsp; }<br />
&nbsp; public static Singleton getInstance(){<br />
&nbsp;&nbsp; if(instance==null)<br />
&nbsp;&nbsp;&nbsp; instance=new Singleton();<br />
&nbsp;&nbsp; return instance;<br />
&nbsp; }<br />
}<br />
这个程序在单线程下运行不会有问题，但是它不能运行在多线程的环境下，若想让运行在多线程的环境下，必须修改如下：<br />
public class Singleton {<br />
&nbsp; private static class Instance{<br />
&nbsp;&nbsp; static final Singleton instance=new Singleton();<br />
&nbsp; }<br />
&nbsp; private Singleton(){<br />
&nbsp;&nbsp; <br />
&nbsp; }<br />
&nbsp; public static Singleton getInstance(){<br />
&nbsp;&nbsp; return Instance.instance;<br />
&nbsp; }<br />
}<br />
这样做之所以可以，是因为静态的内部类Instance只会被装载一次。运行在多线程下的单态设计模式也叫Double-Checked Looking模式。<br />
<img src ="http://www.blogjava.net/flustar/aggbug/163803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-28 20:39 <a href="http://www.blogjava.net/flustar/archive/2007/11/28/singleton.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(八)—Template Method模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/28/templateMethod.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Wed, 28 Nov 2007 12:36:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/28/templateMethod.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/163802.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/28/templateMethod.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/163802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/163802.html</trackback:ping><description><![CDATA[<p>&nbsp;《设计模式》一书对Template Method模式是这样描述的：<br />
&nbsp;定义一个操作中算法的骨架，而将一些步骤延迟到子类中。不改变算法的结构而重新定义它的步骤。<br />
&nbsp;我的理解：定义一个抽象类或者说接口，在它的内部定义一些抽象的方法（供TemplateMethod调用的步骤）和一个TemplateMethod方法（非抽象方法），封装了这些抽象方法的接口或抽象类就是骨架。而将它的实现延迟到子类中，也就是用子类实现它。不改变算法的结构而重新定义它的步骤，也就是改写或者实现父类的这些非TemplateMethod的抽象方法。下面给出一个例子:<br />
abstract class QueryTemplate{<br />
&nbsp;public void doQuery(){&nbsp; //Template Method<br />
&nbsp;&nbsp;formatConnect();<br />
&nbsp;&nbsp;formatSelect();<br />
&nbsp;}<br />
&nbsp; protected abstract void formatConnect();<br />
&nbsp; protected abstract void formatSelect();<br />
}<br />
class OracleQT extends QueryTemplate{<br />
&nbsp;public void formatConnect() {<br />
&nbsp;&nbsp;System.out.println("格式化Qracle数据库连接");<br />
&nbsp;}<br />
&nbsp;public void formatSelect() {<br />
&nbsp;&nbsp;System.out.println("格式化Oracle数据库查询");<br />
&nbsp;}<br />
}<br />
class MysqlQT extends QueryTemplate{<br />
&nbsp;public void formatConnect() {<br />
&nbsp;&nbsp;System.out.println("格式化Mysql数据库连接");<br />
&nbsp;}<br />
&nbsp;public void formatSelect() {<br />
&nbsp;&nbsp;System.out.println("格式化Mysql数据库查询");<br />
&nbsp;}<br />
}<br />
public class client {<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;QueryTemplate oracleQT=new OracleQT();<br />
&nbsp;&nbsp;oracleQT.doQuery();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;QueryTemplate mysqlQT=new MysqlQT();<br />
&nbsp;&nbsp;mysqlQT.doQuery();<br />
&nbsp;}<br />
}<br />
输出结果：<br />
格式化Qracle数据库连接<br />
格式化Oracle数据库查询<br />
格式化Mysql数据库连接<br />
格式化Mysql数据库查询<br />
在这个例子中，我们定义了一个骨架QueryTemplate，在它的内部定义了一个Template Method,和一些步骤（抽象方法）,使用Template Method来调用这些步骤。步骤是在子类中实现的。<br />
小结:有时候，会遇到由一系列步骤构成的过程需要执行。这个过程从高层次上看是相同的，但有些步骤的实现可能不同。正如，查询SQL数据库从高层次上看过程是相同的，但某些细节比如如何连接数据库则可能因平台等细节的不同而不同。通过Template Method模式，我们可以先定义步骤序列，然后覆盖那些需要改变的步骤。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/flustar/aggbug/163802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-28 20:36 <a href="http://www.blogjava.net/flustar/archive/2007/11/28/templateMethod.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(七)—Observer观察者模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/28/observer.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Wed, 28 Nov 2007 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/28/observer.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/163801.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/28/observer.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/163801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/163801.html</trackback:ping><description><![CDATA[<p>&nbsp;《设计模式》一书对Observer是这样描述的：<br />
定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都将得到通知并自动更新。<br />
举个例子，在现实生活中，父母与孩子是最亲密的人。父母做为孩子(被观察者)的监护人（观察者）,当孩子和别人打架后，一定会告诉他的父母这件事（呵呵，当孩子很小时，通常会告诉父母，长大了以后，可能不会，这里的孩子指的是小孩子）,当孩子获得奖学金后，也一定会告诉他的父母。下面我用Observer实现这个程序。代码如下:<br />
import java.util.Vector;</p>
<p>class Children{<br />
&nbsp;static private Vector&lt;Observer&gt; obs;<br />
&nbsp;static private String state=null;<br />
&nbsp;static{<br />
&nbsp;&nbsp;obs=new Vector&lt;Observer&gt;();<br />
&nbsp;}<br />
&nbsp;public static void attach(Observer o){<br />
&nbsp;&nbsp;obs.addElement(o);<br />
&nbsp;}<br />
&nbsp;public static void detach(Observer o){<br />
&nbsp;&nbsp;obs.removeElement(o);<br />
&nbsp;}<br />
&nbsp;public void setState(String str){<br />
&nbsp;&nbsp;state=str;<br />
&nbsp;}<br />
&nbsp;public String getState(){<br />
&nbsp;&nbsp;return state;<br />
&nbsp;}<br />
&nbsp;public void notifyObs(){<br />
&nbsp;&nbsp;for(Observer o:obs){<br />
&nbsp;&nbsp;&nbsp;o.update(this);&nbsp;<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
interface Observer{<br />
&nbsp;public void update(Children child);<br />
}<br />
class Parent implements Observer{<br />
&nbsp;public void update(Children child){<br />
&nbsp;&nbsp;if(child.getState().equals("fight")){<br />
&nbsp;&nbsp;&nbsp;System.out.println("Parent，他和别人打架了");<br />
&nbsp;&nbsp;}else if(child.getState().equals("scholarship")){<br />
&nbsp;&nbsp;&nbsp;System.out.println("告诉Parent,他得到了奖学金");<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
class Mother implements Observer{<br />
&nbsp;public void update(Children child){<br />
&nbsp;&nbsp;if(child.getState().equals("fight")){<br />
&nbsp;&nbsp;&nbsp;System.out.println("告诉Mother，他和别人打架了");<br />
&nbsp;&nbsp;}else if(child.getState().equals("scholarship")){<br />
&nbsp;&nbsp;&nbsp;System.out.println("告诉Mother,他得到了奖学金");<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
public class Client {</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;Children child=new Children();<br />
&nbsp;&nbsp;Observer parent=new Parent();<br />
&nbsp;&nbsp;Observer mother=new Mother();<br />
&nbsp;&nbsp;child.attach(parent);<br />
&nbsp;&nbsp;child.attach(mother);<br />
&nbsp;&nbsp;child.setState("fight");<br />
&nbsp;&nbsp;child.notifyObs();<br />
&nbsp;&nbsp;child.setState("scholarship");<br />
&nbsp;&nbsp;child.notifyObs();</p>
<p>&nbsp;}</p>
<p>}</p>
<p>输出如下:<br />
告诉Parent，他和别人打架了<br />
告诉Mother，他和别人打架了<br />
告诉Parent,他得到了奖学金<br />
告诉Mother,他得到了奖学金<br />
&nbsp;小结：对于Observer模式，触发事件的对象-Subject对象无法预测可能需要知道该事件的所有对象。为了解决这一问题，我们创建一个Observer接口，要求所有的Observer负责将自己注册到Subject上。<br />
</p>
<img src ="http://www.blogjava.net/flustar/aggbug/163801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-28 20:34 <a href="http://www.blogjava.net/flustar/archive/2007/11/28/observer.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(六)—Decorator装饰模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/28/decorator.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Wed, 28 Nov 2007 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/28/decorator.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/163800.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/28/decorator.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/163800.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/163800.html</trackback:ping><description><![CDATA[<p>《设计模式》一书对Decorator是这样描述的：<br />
&nbsp;动态地给一个对象添加一些额外的职责。就增加功能来说，Decorator模式比生成子类更为灵活。<br />
也就是说：动态地给对象添加一些额外的功能。它的工作原理是：创建一个始于Decorator对象（负责新功能的对象）终止于原对象的一个对象的&#8220;链&#8221;。例如，我们要为超市的收银台设计一个打印票据的程序，有的需要打印票据的头信息，有的需要打印票据的页脚信息，有的只需要打印票据的内容。如果针对每一种情况都修改一次程序，势必会很麻烦。这时我们可以考虑使用Decorator模式。其结构类图如下：<br />
&nbsp;<img height="288" alt="" src="http://www.blogjava.net/images/blogjava_net/flustar/clip_image003.jpg" width="496" border="0" /></p>
<p>代码如下：<br />
abstract class Component{<br />
&nbsp;abstract public void printTicket();<br />
}<br />
class SalesTicket extends Component{<br />
&nbsp;public void printTicket() {<br />
&nbsp;&nbsp;System.out.println("打印出salesTicket的内容");<br />
&nbsp;}<br />
}<br />
abstract class TicketDecorator extends Component{<br />
&nbsp;private Component myTrailer;<br />
&nbsp;public TicketDecorator(Component myComponent){<br />
&nbsp;&nbsp;myTrailer=myComponent;<br />
&nbsp;}<br />
&nbsp;public void callTrailer(){<br />
&nbsp;&nbsp;if(myTrailer!=null)<br />
&nbsp;&nbsp;&nbsp;myTrailer.printTicket();<br />
&nbsp;}<br />
}<br />
class Header extends TicketDecorator{<br />
&nbsp;public Header(Component myComponent){<br />
&nbsp;&nbsp;super(myComponent);<br />
&nbsp;}<br />
&nbsp;public void printTicket(){<br />
&nbsp;&nbsp;System.out.println("打印salesTicket的头信息");<br />
&nbsp;&nbsp;super.callTrailer();<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
}<br />
class Footer extends TicketDecorator{<br />
&nbsp;public Footer(Component myComponent){<br />
&nbsp;&nbsp;super(myComponent);<br />
&nbsp;}<br />
&nbsp;public void printTicket(){<br />
&nbsp;&nbsp;super.callTrailer();<br />
&nbsp;&nbsp;System.out.println("打印salesTicket的页脚信息");<br />
&nbsp;}<br />
}<br />
public class Client {</p>
<p>&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;System.out.println("====================================");<br />
&nbsp;&nbsp;new Header(new Footer(new SalesTicket())).printTicket();<br />
&nbsp;&nbsp;System.out.println("====================================");<br />
&nbsp;&nbsp;new Footer(new Header(new SalesTicket())).printTicket();<br />
&nbsp;&nbsp;System.out.println("====================================");<br />
&nbsp;}</p>
<p>}<br />
输出结果如下:<br />
====================================<br />
打印salesTicket的头信息<br />
打印出salesTicket的内容<br />
打印salesTicket的页脚信息<br />
====================================<br />
打印salesTicket的头信息<br />
打印出salesTicket的内容<br />
打印salesTicket的页脚信息<br />
====================================<br />
从这个例子我们可以看出，Decorator模式把问题分为两部分：<br />
1）&nbsp;如何实现提供新功能的对象。<br />
2）&nbsp;如何为每种特殊情况组织对象。<br />
这样能够将Decorator对象的实现与决定如何使用Decorator的对象分离开来，从而提高了内聚性，因为每个Decorator对象只用关心自己添加的功能，无需关心自己是如何被加入到对象链中。还可以任意地重排Decorator的顺序，无需改变其任何代码。<br />
小结：Decorator模式的适用场合是，各种可选的功能在另一个肯定要执行的功能之前或之后执行。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/flustar/aggbug/163800.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-28 20:31 <a href="http://www.blogjava.net/flustar/archive/2007/11/28/decorator.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(五)—Abstract Factory抽象工厂模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/28/abstractFactory.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Wed, 28 Nov 2007 12:23:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/28/abstractFactory.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/163799.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/28/abstractFactory.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/163799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/163799.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">GOF</span><span style="font-family: 宋体">《设计模式》一书对Abstract Factory模式是这样描述的:</span>
<p style="text-align: left" align="left"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">为创建一组相关或相互依赖的对象提供一个接口，而且无需指定它们的具体类。<br />
</span><span style="font-family: 宋体">&nbsp; </span><span style="font-family: 宋体">大致意思是说：我们在创建这些对象的时候，并不需要指定它们的具体类，这些具体类的对象是由工厂对象负责实例化的。下面是《Design Patterns Explained》一书的例子，有关计算机系统的显示和打印程序，用来显示和打印的分辨率取决于当前运行的系统。低端机使用低分辨率的显示和打印驱动程序，高端机使用高分辨率的显示和打印驱动程序。其结构图如下：<br />
</span></p>
<p style="text-align: left" align="left"><span style="font-family: 宋体"><img height="402" alt="" src="http://www.blogjava.net/images/blogjava_net/flustar/clip_image002.jpg" width="480" border="0" /><br />
代码如下:</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">abstract </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> ResFactory{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">abstract </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> <span style="background: silver">DisplayDriver</span> getDisplayDrvr();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">abstract </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> PrintDriver getPrintDrvr();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> LowResFact </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> ResFactory{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> <span style="background: silver">DisplayDriver</span> getDisplayDrvr() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">return</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">new</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> LRDD();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> PrintDriver getPrintDrvr() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">return</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">new</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> LRPD();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> HighResFact </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> ResFactory{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> <span style="background: silver">DisplayDriver</span> getDisplayDrvr() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">return</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">new</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> HRDD();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> PrintDriver getPrintDrvr() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">return</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">new</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> HRPD();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">abstract </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> <span style="background: silver">DisplayDriver</span>{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">abstract </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> PrintDriver{</span></p>
<p style="text-align: left" align="left"></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> HRDD </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> <span style="background: silver">DisplayDriver</span>{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> HRDD() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10pt; color: black; font-family: 宋体">System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 宋体">out</span></em><span style="font-size: 10pt; color: black; font-family: 宋体">.println(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">使用高端机的显示驱动程序"</span><span style="font-size: 10pt; color: black; font-family: 宋体">)<br />
</span><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;}</span><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> LRDD </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> <span style="background: silver">DisplayDriver</span>{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> LRDD(){</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 宋体">out</span></em><span style="font-size: 10pt; color: black; font-family: 宋体">.println(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">使用低端机的显示驱动程序"</span><span style="font-size: 10pt; color: black; font-family: 宋体">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> HRPD </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> PrintDriver{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> HRPD() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 宋体">out</span></em><span style="font-size: 10pt; color: black; font-family: 宋体">.println(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">使用高端机的打印驱动程序"</span><span style="font-size: 10pt; color: black; font-family: 宋体">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> LRPD </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> PrintDriver{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> LRPD() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 宋体">out</span></em><span style="font-size: 10pt; color: black; font-family: 宋体">.println(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">使用低端机的打印驱动程序"</span><span style="font-size: 10pt; color: black; font-family: 宋体">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> ApControl {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">static</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> ResFactory getResFactory(ResFactory factory){</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">return</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> factory;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">static </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">void</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> main(String[] args) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResFactory highResFact=ApControl.<em>getResFactory</em>(</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">new</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> HighResFact());</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; highResFact.getDisplayDrvr();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; highResFact.getPrintDrvr();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResFactory lowResFact=ApControl.<em>getResFactory</em>(</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体">new</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体"> LowResFact());</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lowResFact.getDisplayDrvr();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lowResFact.getPrintDrvr();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">}</span><span style="font-size: 10pt; color: black; font-family: 宋体">输出结果：</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">使用高端机的显示驱动程序</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">使用高端机的打印驱动程序</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">使用低端机的显示驱动程序</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体">使用低端机的打印驱动程序</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; font-family: 宋体">在这个例子中ApControl使用派生自两个不同的服务类(DisplayDriver和PrintDriver)的对象。这个设计非常简化，隐藏了实现细节，系统的可维护性也更好。ApControl不知道自己拥有的服务对象的那个特定具体实现，因为创建对象是工厂的职责。ApControl也不知道自己使用的是哪个特定工厂，因为它只知道自己有一个ResFactory对象。它可能是一个HighResFact也可能是一个LowResFact，但它不知道到底是哪一个。</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; font-family: 宋体">小结：在必须协调一组对象的创建时，可以应用Abstract Factory模式。它提供了一种方式，将如何执行对象实例化的规则从使用这些对象的客户对象中提取出来。首先，找出实例化的规则，定义了一个带接口的抽象类，其中的接口为每种需要实例化的对象提供一个方法。然后，从这个类为每个组实现具体类。最后，由客户对象决定使用具体工厂来创建所需的对象。它主要适用于以下几种情况:</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; text-align: left; tab-stops: list 18.0pt" align="left"><span style="font-size: 10pt; font-family: 宋体">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">一个系统要独立于它的产品的创建、组合和表示时。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; text-align: left; tab-stops: list 18.0pt" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">可以对系统进行配置，以便系统可以使用多个产品系列中的某一个。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; text-align: left; tab-stops: list 18.0pt" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">3)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">当需要强调一系列相关产品对象的设计以便进行联合使用时。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; text-align: left; tab-stops: list 18.0pt" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">4)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; font-family: 宋体">当希望提供一个产品类库，而只想显示他们的接口而不是实现时。</span></p>
<img src ="http://www.blogjava.net/flustar/aggbug/163799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-28 20:23 <a href="http://www.blogjava.net/flustar/archive/2007/11/28/abstractFactory.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(四)—Bridge桥接模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/28/bridge.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Wed, 28 Nov 2007 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/28/bridge.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/163710.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/28/bridge.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/163710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/163710.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">&nbsp;&nbsp; 《设计模式》一书对Bridge是这样描述的：</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">将抽象与其实现解耦，使它们都可以独立地变化。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">大致意思是说：将一组实现与另一组使用他们的对象分离。这里的实现指的是抽象类及其</span></p>
<p><span style="font-family: 宋体">派生类用来实现自己的对象（而不是抽象类的派生类，这些派生类被称为具体类）。下面</span></p>
<p><span style="font-family: 宋体">是《Design Patterns Explained》书中的例子。其结构图如下：<br />
<span style="font-size: 10pt; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">&nbsp;<span style="font-size: 10pt; font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-ansi-language: ZH-CN; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">&nbsp;<img height="368" alt="" src="http://www.blogjava.net/images/blogjava_net/flustar/clip_image001.gif" width="501" border="0" /><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype></span><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype></span><br />
</span></p>
<p><span style="font-family: 宋体">下面是它的实现：</span></p>
<p style="text-align: left" align="left"><span style="color: #7f0055; font-family: 宋体">abstract　</span><span style="color: #7f0055; font-family: 宋体">class</span><span style="color: black; font-family: 宋体"> Shape{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">protected</span><span style="color: black; font-family: 宋体"> <span style="background: silver">Drawing</span> </span><span style="color: #0000c0; font-family: 宋体">myDrawing</span><span style="color: black; font-family: 宋体">;</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">abstract　</span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> draw();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; Shape(<span style="background: silver">Drawing</span> drawing){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000c0; font-family: 宋体">myDrawing</span><span style="color: black; font-family: 宋体">=drawing;</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">protected　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawLine(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000c0; font-family: 宋体">myDrawing</span><span style="color: black; font-family: 宋体">.drawLine();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">protected　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawCircle(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000c0; font-family: 宋体">myDrawing</span><span style="color: black; font-family: 宋体">.drawCircle();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: #7f0055; font-family: 宋体">class</span><span style="color: black; font-family: 宋体"> Rectangle </span><span style="color: #7f0055; font-family: 宋体">extends</span><span style="color: black; font-family: 宋体"> Shape{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public</span><span style="color: black; font-family: 宋体"> Rectangle(<span style="background: silver">Drawing</span> darw){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">super</span><span style="color: black; font-family: 宋体">(darw);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> draw(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drawLine();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drawLine();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drawLine();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drawLine();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;</span><span style="color: #7f0055; font-family: 宋体">class</span><span style="color: black; font-family: 宋体"> Circle </span><span style="color: #7f0055; font-family: 宋体">extends</span><span style="color: black; font-family: 宋体"> Shape{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public</span><span style="color: black; font-family: 宋体"> Circle(<span style="background: silver">Drawing</span> draw){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">super</span><span style="color: black; font-family: 宋体">(draw);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> draw(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000c0; font-family: 宋体">myDrawing</span><span style="color: black; font-family: 宋体">.drawCircle();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: #7f0055; font-family: 宋体">abstract　</span><span style="color: #7f0055; font-family: 宋体">class</span><span style="color: black; font-family: 宋体"> <span style="background: silver">Drawing</span>{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">abstract　</span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawLine();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">abstract　</span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawCircle();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: #7f0055; font-family: 宋体">class</span><span style="color: black; font-family: 宋体"> V1Drawing </span><span style="color: #7f0055; font-family: 宋体">extends</span><span style="color: black; font-family: 宋体"> <span style="background: silver">Drawing</span>{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawLine(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DP1.draw_a_line();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawCircle(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DP1.draw_a_circle();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: #7f0055; font-family: 宋体">class</span><span style="color: black; font-family: 宋体"> V2Drawing </span><span style="color: #7f0055; font-family: 宋体">extends</span><span style="color: black; font-family: 宋体"> <span style="background: silver">Drawing</span>{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawLine(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DP2.drawLine();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawCircle(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DP2.drawCircle();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: #7f0055; font-family: 宋体">class</span><span style="color: black; font-family: 宋体"> DP1{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">static　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> draw_a_line(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: 宋体">System.</span><span style="color: #0000c0; font-family: 宋体">out</span><span style="color: black; font-family: 宋体">.println(</span><span style="color: #2a00ff; font-family: 宋体">"使用DP1的draw_a_line()画线"</span><span style="color: black; font-family: 宋体">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">static　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> draw_a_circle(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: 宋体">System.</span><span style="color: #0000c0; font-family: 宋体">out</span><span style="color: black; font-family: 宋体">.println(</span><span style="color: #2a00ff; font-family: 宋体">"使用DP1的draw_a_circle()画圆"</span><span style="color: black; font-family: 宋体">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: #7f0055; font-family: 宋体">class</span><span style="color: black; font-family: 宋体"> DP2{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">static　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawLine(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><span style="color: #0000c0; font-family: 宋体">out</span><span style="color: black; font-family: 宋体">.println(</span><span style="color: #2a00ff; font-family: 宋体">"使用DP2的drawLine()画线"</span><span style="color: black; font-family: 宋体">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">static　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> drawCircle(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><span style="color: #0000c0; font-family: 宋体">out</span><span style="color: black; font-family: 宋体">.println(</span><span style="color: #2a00ff; font-family: 宋体">"使用DP2的drawCircle()画圆"</span><span style="color: black; font-family: 宋体">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;</span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">class</span><span style="color: black; font-family: 宋体"> BridgeClient {</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="color: #7f0055; font-family: 宋体">public　</span><span style="color: #7f0055; font-family: 宋体">static　</span><span style="color: #7f0055; font-family: 宋体">void</span><span style="color: black; font-family: 宋体"> main(String[] args) {</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background: silver">Drawing</span> draw1=</span><span style="color: #7f0055; font-family: 宋体">new</span><span style="color: black; font-family: 宋体"> V1Drawing();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background: silver">Drawing</span> draw2=</span><span style="color: #7f0055; font-family: 宋体">new</span><span style="color: black; font-family: 宋体"> V2Drawing();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shape shape1=</span><span style="color: #7f0055; font-family: 宋体">new</span><span style="color: black; font-family: 宋体"> Rectangle(draw1);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shape1.draw();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shape shape2=</span><span style="color: #7f0055; font-family: 宋体">new</span><span style="color: black; font-family: 宋体"> Circle(draw2);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shape2.draw();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">}</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">输出结果如下</span><span style="color: black; font-family: 宋体">：</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">使用</span><span style="color: black; font-family: 宋体">DP1</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: 宋体">draw_a_line()</span><span style="color: black; font-family: 宋体">画线</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">使用</span><span style="color: black; font-family: 宋体">DP1</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: 宋体">draw_a_line()</span><span style="color: black; font-family: 宋体">画线</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">使用</span><span style="color: black; font-family: 宋体">DP1</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: 宋体">draw_a_line()</span><span style="color: black; font-family: 宋体">画线</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">使用</span><span style="color: black; font-family: 宋体">DP1</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: 宋体">draw_a_line()</span><span style="color: black; font-family: 宋体">画线</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">使用</span><span style="color: black; font-family: 宋体">DP2</span><span style="color: black; font-family: 宋体">的</span><span style="color: black; font-family: 宋体">drawCircle()</span><span style="color: black; font-family: 宋体">画圆</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">在这个例子中</span><span style="color: black; font-family: 宋体">Shape</span><span style="color: black; font-family: 宋体">对象实际上是一个</span><span style="color: black; font-family: 宋体">Retangle</span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: 宋体">Circle</span><span style="color: black; font-family: 宋体">对象</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: 宋体">但</span><span style="color: black; font-family: 宋体">Client</span><span style="color: black; font-family: 宋体">并不知道到底是那个</span><span style="color: black; font-family: 宋体">，</span><span style="color: black; font-family: 宋体">因为它们看起来都一样。</span><span style="color: black; font-family: 宋体">Drawing</span><span style="color: black; font-family: 宋体">实际上是一个</span><span style="color: black; font-family: 宋体">V1Drawing</span><span style="color: black; font-family: 宋体">或</span><span style="color: black; font-family: 宋体">V2Drawing,</span><span style="color: black; font-family: 宋体">但</span><span style="color: black; font-family: 宋体">Shape</span><span style="color: black; font-family: 宋体">对象</span><span style="font-family: 宋体">并知道到底是哪个</span><span style="font-family: 宋体">，</span><span style="font-family: 宋体">因为它们看起来都一样。DP1或DP2使用它的Drawing对象知道是哪一个。Shape是事物的抽象，Drawing是实现或者操作事物方法的抽象。他们两个都可以独立地变化。正如例子中所说那样，我们可以输出一个矩形可以使用V1Drawing也可以使用V2Drawing来完成，输出一个圆形也是一样都有两种方法。Bridge模式遵循了设计模式中两条基本策略：找出变化并封装之和优先使用对象聚集，而不是类继承。</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 小结：Bridge模式是一种抽象与其实现相分离的模式。它主要应用于：当事物是一组变化量，和对这些事物的操作方法(实现)也是一组变化量的情况，也就是说它们都是多变的。</span></p>
<img src ="http://www.blogjava.net/flustar/aggbug/163710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-28 15:48 <a href="http://www.blogjava.net/flustar/archive/2007/11/28/bridge.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(三)—-Strategy策略模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/23/strategy.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Fri, 23 Nov 2007 10:43:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/23/strategy.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/162707.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/23/strategy.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/162707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/162707.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt"><span style="font-family: 宋体">GOF</span><span style="font-family: 宋体">《设计模式》一书对Strategy模式是这样描述的:</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">定义一系列的算法，把他们一个个封装起来，并且使它们可相互替换。Strategy模式使算法可独立于使用它的客户而变化。</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; Strategy</span><span style="font-family: 宋体">模式以下列几条原则为基础：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">1）&nbsp;</span><span style="font-family: 宋体">每个对象都是一个具有职责的个体。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">2）&nbsp;</span><span style="font-family: 宋体">这些职责不同的具体实现是通过多态的使用来完成的。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">3）&nbsp;</span><span style="font-family: 宋体">概念上相同的算法具有多个不同的实现，需要进行管理。</span></p>
<p><span style="font-family: 宋体">下面我将通过一个实例来说明它的具体使用，这个例子是关于数据库连接的。代码如下：</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">interface</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> DatabaseStrategy{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> process();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> MysqlDBStrategy </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> DatabaseStrategy{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> process() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">out</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.println(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">处理</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">Mysql</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">数据库连接</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> OracleDBStrategy </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> DatabaseStrategy{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> process() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">out</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.println(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">处理</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">Oracle</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">数据库连接</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> DataBaseManager{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> process(DatabaseStrategy dbStrategy){</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbStrategy.process();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> <span style="background: silver">StrategyClient</span> {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">static </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> main(String[] args) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MysqlDBStrategy mysql=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> MysqlDBStrategy();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataBaseManager manager=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> DataBaseManager();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; manager.process(mysql);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OracleDBStrategy oracle=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> OracleDBStrategy();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; manager.process(oracle);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">在我们的实际编程中经常会遇到系统要连接的数据库可能不只一种，如果采用传统的方法，即修改连接Url的方法，这种方法确实可行，但是有一个问题要经常修改源代码，不利于以后的维护，那么有没有一种更好的方法呢？答案是有，使用Strategy模式，首先定义一个连接数据库通用的接口（在上面的例子中是DatabaseStrategy）,然后再定义实现该接口的具体类(MysqlDBStrategy、OracleDBStrategy)，在这些具体类，实现具体的逻辑。最后再定义一个管理数据库连接的类(DataBaseManager),它的内部有一个方法可以接受具体类实例的参数。我们可以看到这个参数是DatabaseStrategy类型的，也就是说它可以接受任何一个实现了DatabaseStrategy接口的类的具体实例（这里运用了对象替换机制，多态的一种），从而完成数据库连接的处理。如果我们还需要处理另外一种数据库如sqlserver，我们只需要建立一个SqlserverDBStrategy类实现DatabaseStrategy接口，把该类的实例传给DatabaseManager的process方法即可。</span></p>
<span style="font-size: 10.5pt; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10.5pt; font-family: 宋体">小结：Strategy模式是一种定义一系列算法的方法。概念上看，这些算法完成的都是相同的工作，只是实现不同。</span>
<img src ="http://www.blogjava.net/flustar/aggbug/162707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-23 18:43 <a href="http://www.blogjava.net/flustar/archive/2007/11/23/strategy.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(二)—-Adapter适配器模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/23/adapter.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Fri, 23 Nov 2007 10:40:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/23/adapter.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/162706.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/23/adapter.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/162706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/162706.html</trackback:ping><description><![CDATA[<p style="text-indent: 21pt"><span style="font-family: 宋体">GOF</span><span style="font-family: 宋体">《设计模式》一书对Adapter模式是这样描述的：<br />
&nbsp;&nbsp;</span><span style="font-family: 宋体">&nbsp;</span><span style="font-family: 宋体">将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">这段话大致是说：我们需要一种方式，为一个功能正确但接口不合的对象创建一个新接口。例如，客户给我们如下需求：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">1）&nbsp;</span><span style="font-family: 宋体">为都有&#8220;显示&#8221;(display)行为的点、线、正方形分别创建类。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">2）&nbsp;</span><span style="font-family: 宋体">客户对象不必知道自己到底拥有点、线、还是正方形。它只需知道拥有这些形状中的一个。</span></p>
<p><span style="font-family: 宋体">也就是说，我们要用一个更高层次的概念将这些具体形状都涵盖进去，这个高层概念可以称为：&#8220;可显示的形状&#8221;。因此，我们需要创建一个接口Shape:</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">interface</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Shape{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> display();</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 宋体">现在客户忽然间有让我们给这个系统增加一个画圆的功能。这个看起来很简单，只需定义一个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Circle</span><span style="font-size: 10pt; color: black; font-family: 宋体">类来实现</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Shape</span><span style="font-size: 10pt; color: black; font-family: 宋体">接口，但是我们要给它编写</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">display</span><span style="font-size: 10pt; color: black; font-family: 宋体">方法，这可不是件简单的事，假如此时我们正好发现一个</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">XXCircle</span><span style="font-size: 10pt; color: black; font-family: 宋体">类，它有一个方法刚好可以完成这个功能，那么有没有更好的方法来利用它呢，这时我们就要用到</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Adapter</span><span style="font-size: 10pt; color: black; font-family: 宋体">模式了。</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">XXCircle</span><span style="font-size: 10pt; color: black; font-family: 宋体">代码如下：</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> XXCircle{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> displayCircle(){</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">out</span></em><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.println(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">通过</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">XXCircle.displayCircle()</span><span style="font-size: 10pt; color: #2a00ff; font-family: 宋体">画圆</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; Adapter</span><span style="font-size: 10pt; color: black; font-family: 宋体">模式有两种类型：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10pt; color: black; font-family: 宋体">对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Adapter</span><span style="font-size: 10pt; color: black; font-family: 宋体">模式，它依赖于一个对象（适配器）包含另一个对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(</span><span style="font-size: 10pt; color: black; font-family: 宋体">被适配的对象</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span><span style="font-size: 10pt; color: black; font-family: 宋体">。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> CircleObject </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Shape{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> XXCircle </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">circle</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> CircleObject(XXCircle xxcircle){</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">circle</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=xxcircle;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> display() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: #0000c0; font-family: 'Courier New'">circle</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.displayCircle();&nbsp;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Client {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">static </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> main(String[] args) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XXCircle circle=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> XXCircle();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CircleObject <span style="background: silver">co</span>=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> CircleObject(circle);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="background: silver">co</span>.display();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="margin-left: 18pt"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">类Adapter模式，它是通过多重继承来实现的（java中没有多继承，是通过接口来实现的）。</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> CircleClass </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> XXCircle </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Shape{</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> display() {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">super</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">.displayCircle();&nbsp;&nbsp; </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Client {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">static </span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> main(String[] args) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CircleClass cc=</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> CircleClass();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc.display();</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">小结：Adapter模式是一个很常用的模式，它将一个（或多个）类的接口转换成我们需要类所具备的一个接口。它的实现方式是：创建一个具备所需接口的类，然后包装原有类的方法，这样实际上就包含了被适配的对象。它主要适用于以下几种情况：</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">1）&nbsp;</span><span style="font-family: 宋体">你希望使用他人编写的子程序或方法，因为你需要它所执行的功能。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">2）&nbsp;</span><span style="font-family: 宋体">你无法将这个子程序直接加入程序中。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">3）&nbsp;</span><span style="font-family: 宋体">子程序的接口或调用方式与需要使用它的相关对象不完全相同。</span></p>
<img src ="http://www.blogjava.net/flustar/aggbug/162706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-23 18:40 <a href="http://www.blogjava.net/flustar/archive/2007/11/23/adapter.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习笔记(一)--Facade外观模式</title><link>http://www.blogjava.net/flustar/archive/2007/11/23/facade.html</link><dc:creator>flustar</dc:creator><author>flustar</author><pubDate>Thu, 22 Nov 2007 17:45:00 GMT</pubDate><guid>http://www.blogjava.net/flustar/archive/2007/11/23/facade.html</guid><wfw:comment>http://www.blogjava.net/flustar/comments/162506.html</wfw:comment><comments>http://www.blogjava.net/flustar/archive/2007/11/23/facade.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/flustar/comments/commentRss/162506.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/flustar/services/trackbacks/162506.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOF<span style="font-family: 宋体">《设计模式》一书对</span>Facade<span style="font-family: 宋体">模式是这样描述的</span>:
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">为子系统中的一组接口提供一个统一接口。</span>Facade<span style="font-family: 宋体">模式定义了一个更高层的接口，使子系统更加容易使用。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">大致意思是说：使用一种比原有方式更简单的办法与系统交互。例如，我们把一个很文件的文件，放在了第二抽屉里，而第二个抽屉的钥匙放在了第一个抽屉里，我们要想取出这个文件，第一步肯定要拿到第一个抽屉的钥匙，然后打开它再拿出第二个抽屉的钥匙，最后打开第二个抽屉取出文件。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">我就上面说的那个情形写一下实现代码，首先我们要实现二个子系统,呵呵，把抽屉比喻成系统，有点夸张了（</span><span style="background: silver; color: black; font-family: 'Courier New'">DrawerOne</span><span style="font-family: 宋体">、</span><span style="color: black; font-family: 'Courier New'">DrawerTwo</span><span style="font-family: 宋体">）：</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerOne {</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> open(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="color: #0000c0; font-family: 'Courier New'">out</span></em><span style="color: black; font-family: 'Courier New'">.println(</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: #2a00ff; font-family: 宋体">第一个抽屉被打开了</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getKey();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> getKey(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="color: #0000c0; font-family: 'Courier New'">out</span></em><span style="color: black; font-family: 'Courier New'">.println(</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: #2a00ff; font-family: 宋体">得到第二个抽屉的钥匙</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerTwo{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> open(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="color: #0000c0; font-family: 'Courier New'">out</span></em><span style="color: black; font-family: 'Courier New'">.println(</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: #2a00ff; font-family: 宋体">第二个抽屉被打开了</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getFile();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> getFile(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.</span><em><span style="color: #0000c0; font-family: 'Courier New'">out</span></em><span style="color: black; font-family: 'Courier New'">.println(</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: #2a00ff; font-family: 宋体">得到这个重要文件</span><span style="color: #2a00ff; font-family: 'Courier New'">"</span><span style="color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">}</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> Client{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">static </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> main(String []args){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrawerOne darwerOne=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerOne();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrawerTwo darwerTwo=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerTwo();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; darwerOne.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; darwerTwo.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: black; font-family: 'Courier New'">}</span></p>
<p style="text-indent: 21pt"><span style="color: black; font-family: 宋体">由于没有使用</span><span style="color: black; font-family: 'Courier New'">Fa&#231;ade</span><span style="color: black; font-family: 宋体">模式，可以看到要想得到这个文件要首先打开第一个抽屉，然后再打开第二个抽屉，在我们实际所开发的系统中，有时候客户要实现某一操作，并不需要知道实现这一操作的详细步骤，而是简单地点击某一个按钮就可以得到自己想要的结果。下面对上面的代码使用</span><span style="color: black; font-family: 'Courier New'">Fa&#231;ade</span><span style="color: black; font-family: 宋体">模式进行改进，建立一个</span><span style="color: black; font-family: 'Courier New'">FacadeDrawer</span><span style="color: black; font-family: 宋体">类：</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerFacade{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; DrawerOne </span><span style="color: #0000c0; font-family: 'Courier New'">darwerOne</span><span style="color: black; font-family: 'Courier New'">=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerOne();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; DrawerTwo </span><span style="color: #0000c0; font-family: 'Courier New'">darwerTwo</span><span style="color: black; font-family: 'Courier New'">=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerTwo();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> open(){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000c0; font-family: 'Courier New'">darwerOne</span><span style="color: black; font-family: 'Courier New'">.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000c0; font-family: 'Courier New'">darwerTwo</span><span style="color: black; font-family: 'Courier New'">.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: black; font-family: 'Courier New'">}</span></p>
<p><span style="color: black; font-family: 宋体">修改</span><span style="color: black; font-family: 'Courier New'">Client</span><span style="color: black; font-family: 宋体">类：</span></p>
<p style="text-align: left" align="left"><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerClient{</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="color: #7f0055; font-family: 'Courier New'">public </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">static </span></strong><strong><span style="color: #7f0055; font-family: 'Courier New'">void</span></strong><span style="color: black; font-family: 'Courier New'"> main(String []args){</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DrawerFacade drawer=</span><strong><span style="color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="color: black; font-family: 'Courier New'"> DrawerFacade();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; drawer.open();</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="color: black; font-family: 'Courier New'">}</span></p>
<p><span style="color: black; font-family: 宋体">输出结果如下：</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">第一个抽屉被打开了</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">得到第二个抽屉的钥匙</span></p>
<p style="text-align: left" align="left"><span style="color: black; font-family: 宋体">第二个抽屉被打开了</span></p>
<p><span style="color: black; font-family: 宋体">得到这个重要文件</span></p>
<p style="text-indent: 21pt"><span style="color: black; font-family: 宋体">正如上面所说，客户端</span><span style="color: black; font-family: 'Courier New'">client</span><span style="color: black; font-family: 宋体">，它并不需要关心子系统，而是关心</span><span style="color: black; font-family: 'Courier New'">DrawerFacade</span><span style="color: black; font-family: 宋体">所留下来的和外部交互的接口，而子系统在</span><span style="color: black; font-family: 'Courier New'">DrawerFacade</span><span style="color: black; font-family: 宋体">的聚合。</span></p>
<p style="text-indent: 21pt"><span style="color: black; font-family: 宋体">以上只是个人拙见，哪里有不正确的地方，希望大家多多批评指正。</span><span style="color: black; font-family: 'Courier New'">^_^</span></p>
<p><span style="color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; Facade</span><span style="color: black; font-family: 宋体">模式主要适用于以下几种情况</span><span style="color: black; font-family: 'Courier New'">:</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="color: black; font-family: 'Courier New'">1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体">不需要使用一个复杂系统的所有功能，而且可以创建一个新的类，包含访问系统的所有规则。如果只需要使用系统的部分功能，那么你为新类所创建的</span><span style="color: black; font-family: 'Courier New'">API</span><span style="color: black; font-family: 宋体">将比原系统的</span><span style="color: black; font-family: 'Courier New'">API</span><span style="color: black; font-family: 宋体">简单的多。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="color: black; font-family: 'Courier New'">2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体">希望封装或者隐藏系统原系统。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="color: black; font-family: 'Courier New'">3)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体">希望使用原系统的功能，而且还希望增加一些新的功能。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="color: black; font-family: 'Courier New'">4)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span><span style="color: black; font-family: 宋体">编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本。</span></p>
<img src ="http://www.blogjava.net/flustar/aggbug/162506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/flustar/" target="_blank">flustar</a> 2007-11-23 01:45 <a href="http://www.blogjava.net/flustar/archive/2007/11/23/facade.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>