﻿<?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-wangq1979-文章分类-Design Pattern</title><link>http://www.blogjava.net/wangq1979/category/27428.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 24 Nov 2007 20:57:38 GMT</lastBuildDate><pubDate>Sat, 24 Nov 2007 20:57:38 GMT</pubDate><ttl>60</ttl><item><title>Strategy模式</title><link>http://www.blogjava.net/wangq1979/articles/162101.html</link><dc:creator>game of programming</dc:creator><author>game of programming</author><pubDate>Wed, 21 Nov 2007 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/wangq1979/articles/162101.html</guid><wfw:comment>http://www.blogjava.net/wangq1979/comments/162101.html</wfw:comment><comments>http://www.blogjava.net/wangq1979/articles/162101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangq1979/comments/commentRss/162101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangq1979/services/trackbacks/162101.html</trackback:ping><description><![CDATA[<p>《设计模式》中是这样描述Strategy模式的：定义一系列算法，把它们一个个封装起来，并且使它们可相互替换。Strategy模式使算法可以独立于使用它的客户的变化。<br />
Strategy模式的UML图如下所示：<br />
<img height="364" alt="" src="http://www.blogjava.net/images/blogjava_net/wangq1979/images/strategy11.jpeg" width="475" border="0" /></p>
<p>从上图可以看出，具体的算法隐藏在AbstractStrategy类背后，Client无需知道具体算法如何实现，它只需传给Context相关参数即可。在Context中来实现具体算法的选择（通过Client传来的参数）。而算法的具体实现则通过ConcreteStrategy来完成。<br />
这样做有以下几个好处：<br />
1 算法的选择与实现相分离。符合&#8220;找出变化并封装之&#8221;的原则。如果需要修改或者添加新的算法，只需要修改相对应的ConcreteStrategy或者增加新的ConcreteStrategy并且修改算法的选择即可。<br />
2 Client无需关心算法如何选择和具体实现，只需关心结果。<br />
</p>
<img src ="http://www.blogjava.net/wangq1979/aggbug/162101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangq1979/" target="_blank">game of programming</a> 2007-11-21 15:35 <a href="http://www.blogjava.net/wangq1979/articles/162101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Facade模式和Adapter模式</title><link>http://www.blogjava.net/wangq1979/articles/162067.html</link><dc:creator>game of programming</dc:creator><author>game of programming</author><pubDate>Wed, 21 Nov 2007 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/wangq1979/articles/162067.html</guid><wfw:comment>http://www.blogjava.net/wangq1979/comments/162067.html</wfw:comment><comments>http://www.blogjava.net/wangq1979/articles/162067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangq1979/comments/commentRss/162067.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangq1979/services/trackbacks/162067.html</trackback:ping><description><![CDATA[从包装（Wrapper）的层次上来看，Facade模式和Adapter模式都是使用一个中间类来包装所需要的或者规定的接口，而不是直接调用原有子系统所提供的接口。那么这两种模式有什么区别和联系呢？<br />
1 从所包装的对象或者子系统来说：Facade模式和Adapter模式都需要对一个现成的对象进行包装。但是Facade模式所提供的功能只是子系统所提供功能的子集，即Client只使用子系统的部分功能，而不需要全部功能。Adapter模式则可能提供子系统所有功能或者部分功能。<br />
2 从模式向上所提供的接口来说：在Facade模式中，无需按照某种已有规则对接口举行定义，只是向上提供尽可能简单的接口；而在Adapter模式中，Adapter向上所提供的接口必须按照已有规则进行定义（在大多数情况下，为了保持多态性），即便是有更可能简单的接口。<br />
从以上两方面可以看出，Facade模式的目的就是在于尽可能的简化接口；而Adapter模式则是把不符合定义规则的接口转换成符合定义规则的接口。
<img src ="http://www.blogjava.net/wangq1979/aggbug/162067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangq1979/" target="_blank">game of programming</a> 2007-11-21 13:03 <a href="http://www.blogjava.net/wangq1979/articles/162067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adapter模式</title><link>http://www.blogjava.net/wangq1979/articles/161896.html</link><dc:creator>game of programming</dc:creator><author>game of programming</author><pubDate>Tue, 20 Nov 2007 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/wangq1979/articles/161896.html</guid><wfw:comment>http://www.blogjava.net/wangq1979/comments/161896.html</wfw:comment><comments>http://www.blogjava.net/wangq1979/articles/161896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangq1979/comments/commentRss/161896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangq1979/services/trackbacks/161896.html</trackback:ping><description><![CDATA[<p>《设计模式》一书中对Adapter模式的解释为：将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。</p>
<p>Adapter模式的UML图如下所示：<br />
</p>
<p><img height="205" alt="" src="http://www.blogjava.net/images/blogjava_net/wangq1979/images/adapter.jpeg" width="501" border="0" /><br />
如图所示，Client希望通过一个统一的方式来调用Adaptee所提供的接口，但是Adaptee所提供的接口和Client所规定的接口规则并不一致，所以可以通过Adapter来进行适配。<br />
Adapter模式也是经常被用到的模式，它经常用来保持多态性。比如做一个画图程序Client，要求能够画出Circle、Rectangle和Hentagon，并且定义统一的接口display()和erase()。现在已经有一个能够画出Hentagon的类XXXHentagon，但是XXXHentagon提供的接口与Client所要求的接口规则不一致。为了能够重用XXXHentagon已经实现的功能，可以使用Adapter模式来将XXXHentagon适配成符合Client接口规则的Hentagon类。如下图所示：</p>
<p><img height="393" alt="" src="http://www.blogjava.net/images/blogjava_net/wangq1979/images/AdapterClass.jpeg" width="439" border="0" /><br />
如上图所示，采用Adapter模式具有以下好处（相比与不使用任何模式）：<br />
1 Client不用需要考虑如何去display/erase图形，它只需要将相关参数交给Shape即可；<br />
2 Pentagon（Adapter）保持了类层次的多态性；<br />
3 XXXPentagon得到了重用，而不是完全丢弃去重写。</p>
<img src ="http://www.blogjava.net/wangq1979/aggbug/161896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangq1979/" target="_blank">game of programming</a> 2007-11-20 17:04 <a href="http://www.blogjava.net/wangq1979/articles/161896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Facade模式</title><link>http://www.blogjava.net/wangq1979/articles/161829.html</link><dc:creator>game of programming</dc:creator><author>game of programming</author><pubDate>Tue, 20 Nov 2007 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/wangq1979/articles/161829.html</guid><wfw:comment>http://www.blogjava.net/wangq1979/comments/161829.html</wfw:comment><comments>http://www.blogjava.net/wangq1979/articles/161829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangq1979/comments/commentRss/161829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangq1979/services/trackbacks/161829.html</trackback:ping><description><![CDATA[<p>在《设计模式》一书中，Facade模式的意图是：为子系统中的一组接口提供一个统一接口，Facade模式定义了一个更高层的接口，使子系统更加容易使用。</p>
Facade模式的UML图如下所示：<br />
<br />
<img height="451" alt="" src="http://www.blogjava.net/images/blogjava_net/wangq1979/images/Facade.jpeg" width="715" border="0" /><br />
<br />
如图所示，Facade向下调用SubSystem所提供的功能（并非全部功能，而是部分功能）。TargetSystem则通过Facade提供的接口来调用SubSystem所提供的功能。这样TargetSystem无需知道SubSystem所提供的所有功能及其细节，只需知道Facade所提供的接口即可。Facade存在的目的就是为TargetSystem提供更简单的接口。<br />
Facade的使用非常普遍。比如在调用第三方软件库时，一般不会用到该软件库所提供的所有的接口，而是使用一个Facade类，来包装我们所用到的接口。然后在程序中直接调用Facade所提供的接口即可。<br />
下图是一个调用dom4j的Facade的例子。<br />
<img height="446" alt="" src="http://www.blogjava.net/images/blogjava_net/wangq1979/images/XmlFacade.jpeg" width="665" border="0" /><br />
在XmlFacade中，会使用到Document、Element和Attribute三个由dom4j所使用到的类/接口，而不使用其他dom4j提供的接口。这样在BusinessClass中只需要调用XmlFacade中所提供的接口即可。<br />
同时，Facade模式还能减少客户所需要处理的对象数量。比如在上图中，假设有2个BusinessClass，而这两个BusinessClass都需要调用Document、Element和Attribute。如果没有XmlFacade类，那么这两个BusinessClass都需要分别new一个Document、Element和Attribute类。这样，就需要生成一共6个新实例（Document、Element和Attribute类每个分别为2个）。如果通过XmlFacade类，则每个Document、Element和Attribute类仅需要一个实例，也就是一共需要3个新的实例而已。
<img src ="http://www.blogjava.net/wangq1979/aggbug/161829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangq1979/" target="_blank">game of programming</a> 2007-11-20 14:37 <a href="http://www.blogjava.net/wangq1979/articles/161829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>