??xml version="1.0" encoding="utf-8" standalone="yes"?>国产AV无码专区亚洲精品,亚洲精品无码中文久久字幕,婷婷亚洲天堂影院http://www.tkk7.com/flustar/category/25084.html我们都随时处于正在学?fn)的q程?/description>zh-cnTue, 29 Jan 2008 23:19:23 GMTTue, 29 Jan 2008 23:19:23 GMT60设计模式学习(fn)W记(二十?—FlyWeight享元模式http://www.tkk7.com/flustar/archive/2008/01/26/flyw.htmlflustarflustarSat, 26 Jan 2008 05:45:00 GMThttp://www.tkk7.com/flustar/archive/2008/01/26/flyw.htmlhttp://www.tkk7.com/flustar/comments/177903.htmlhttp://www.tkk7.com/flustar/archive/2008/01/26/flyw.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/177903.htmlhttp://www.tkk7.com/flustar/services/trackbacks/177903.html阅读全文

flustar 2008-01-26 13:45 发表评论
]]>
设计模式学习(fn)W记(二十一)—Composite模式 http://www.tkk7.com/flustar/archive/2007/12/18/composite.htmlflustarflustarTue, 18 Dec 2007 09:10:00 GMThttp://www.tkk7.com/flustar/archive/2007/12/18/composite.htmlhttp://www.tkk7.com/flustar/comments/168537.htmlhttp://www.tkk7.com/flustar/archive/2007/12/18/composite.html#Feedback1http://www.tkk7.com/flustar/comments/commentRss/168537.htmlhttp://www.tkk7.com/flustar/services/trackbacks/168537.html阅读全文

flustar 2007-12-18 17:10 发表评论
]]>
设计模式学习(fn)W记(二十)—Visitor讉K者模?/title><link>http://www.tkk7.com/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.tkk7.com/flustar/archive/2007/12/15/visitor.html</guid><wfw:comment>http://www.tkk7.com/flustar/comments/167985.html</wfw:comment><comments>http://www.tkk7.com/flustar/archive/2007/12/15/visitor.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flustar/comments/commentRss/167985.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flustar/services/trackbacks/167985.html</trackback:ping><description><![CDATA[     摘要: 设计模式之Visitor模式  <a href='http://www.tkk7.com/flustar/archive/2007/12/15/visitor.html'>阅读全文</a><img src ="http://www.tkk7.com/flustar/aggbug/167985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flustar/" target="_blank">flustar</a> 2007-12-15 18:37 <a href="http://www.tkk7.com/flustar/archive/2007/12/15/visitor.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习(fn)W记(十九(ji))—Chain of Responsibility职责链模?/title><link>http://www.tkk7.com/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.tkk7.com/flustar/archive/2007/12/14/cor.html</guid><wfw:comment>http://www.tkk7.com/flustar/comments/167780.html</wfw:comment><comments>http://www.tkk7.com/flustar/archive/2007/12/14/cor.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/flustar/comments/commentRss/167780.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flustar/services/trackbacks/167780.html</trackback:ping><description><![CDATA[     摘要: 设计模式之Chain of Responsibility模式  <a href='http://www.tkk7.com/flustar/archive/2007/12/14/cor.html'>阅读全文</a><img src ="http://www.tkk7.com/flustar/aggbug/167780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flustar/" target="_blank">flustar</a> 2007-12-14 15:07 <a href="http://www.tkk7.com/flustar/archive/2007/12/14/cor.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习(fn)W记(十八)—Mediator中介者模?/title><link>http://www.tkk7.com/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.tkk7.com/flustar/archive/2007/12/12/mediator.html</guid><wfw:comment>http://www.tkk7.com/flustar/comments/167324.html</wfw:comment><comments>http://www.tkk7.com/flustar/archive/2007/12/12/mediator.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flustar/comments/commentRss/167324.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flustar/services/trackbacks/167324.html</trackback:ping><description><![CDATA[     摘要: 设计模式之Mediator模式  <a href='http://www.tkk7.com/flustar/archive/2007/12/12/mediator.html'>阅读全文</a><img src ="http://www.tkk7.com/flustar/aggbug/167324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flustar/" target="_blank">flustar</a> 2007-12-12 20:34 <a href="http://www.tkk7.com/flustar/archive/2007/12/12/mediator.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习(fn)W记(十七)—Memento备忘录模?/title><link>http://www.tkk7.com/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.tkk7.com/flustar/archive/2007/12/08/memento.html</guid><wfw:comment>http://www.tkk7.com/flustar/comments/166286.html</wfw:comment><comments>http://www.tkk7.com/flustar/archive/2007/12/08/memento.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flustar/comments/commentRss/166286.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flustar/services/trackbacks/166286.html</trackback:ping><description><![CDATA[     摘要: 设计模式之Memento模式  <a href='http://www.tkk7.com/flustar/archive/2007/12/08/memento.html'>阅读全文</a><img src ="http://www.tkk7.com/flustar/aggbug/166286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flustar/" target="_blank">flustar</a> 2007-12-08 15:25 <a href="http://www.tkk7.com/flustar/archive/2007/12/08/memento.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习(fn)W记(十六)—Proxy模式http://www.tkk7.com/flustar/archive/2007/12/06/proxy.htmlflustarflustarThu, 06 Dec 2007 05:19:00 GMThttp://www.tkk7.com/flustar/archive/2007/12/06/proxy.htmlhttp://www.tkk7.com/flustar/comments/165779.htmlhttp://www.tkk7.com/flustar/archive/2007/12/06/proxy.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/165779.htmlhttp://www.tkk7.com/flustar/services/trackbacks/165779.html阅读全文

flustar 2007-12-06 13:19 发表评论
]]>
设计模式学习(fn)W记(十五)—State模式http://www.tkk7.com/flustar/archive/2007/12/05/state.htmlflustarflustarWed, 05 Dec 2007 08:35:00 GMThttp://www.tkk7.com/flustar/archive/2007/12/05/state.htmlhttp://www.tkk7.com/flustar/comments/165557.htmlhttp://www.tkk7.com/flustar/archive/2007/12/05/state.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/165557.htmlhttp://www.tkk7.com/flustar/services/trackbacks/165557.html阅读全文

flustar 2007-12-05 16:35 发表评论
]]>
设计模式学习(fn)W记(十四)—Command模式http://www.tkk7.com/flustar/archive/2007/12/05/command.htmlflustarflustarWed, 05 Dec 2007 05:23:00 GMThttp://www.tkk7.com/flustar/archive/2007/12/05/command.htmlhttp://www.tkk7.com/flustar/comments/165467.htmlhttp://www.tkk7.com/flustar/archive/2007/12/05/command.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/165467.htmlhttp://www.tkk7.com/flustar/services/trackbacks/165467.html阅读全文

flustar 2007-12-05 13:23 发表评论
]]>
设计模式学习(fn)W记(十三)—Iteratorq代器模?/title><link>http://www.tkk7.com/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.tkk7.com/flustar/archive/2007/12/04/iterator.html</guid><wfw:comment>http://www.tkk7.com/flustar/comments/165343.html</wfw:comment><comments>http://www.tkk7.com/flustar/archive/2007/12/04/iterator.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flustar/comments/commentRss/165343.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flustar/services/trackbacks/165343.html</trackback:ping><description><![CDATA[     摘要: 设计模式之Iterator模式  <a href='http://www.tkk7.com/flustar/archive/2007/12/04/iterator.html'>阅读全文</a><img src ="http://www.tkk7.com/flustar/aggbug/165343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flustar/" target="_blank">flustar</a> 2007-12-04 23:52 <a href="http://www.tkk7.com/flustar/archive/2007/12/04/iterator.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习(fn)W记(十二)—Builder建造者模?/title><link>http://www.tkk7.com/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.tkk7.com/flustar/archive/2007/12/03/builder.html</guid><wfw:comment>http://www.tkk7.com/flustar/comments/165013.html</wfw:comment><comments>http://www.tkk7.com/flustar/archive/2007/12/03/builder.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flustar/comments/commentRss/165013.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flustar/services/trackbacks/165013.html</trackback:ping><description><![CDATA[     摘要: 设计模式之Builder模式  <a href='http://www.tkk7.com/flustar/archive/2007/12/03/builder.html'>阅读全文</a><img src ="http://www.tkk7.com/flustar/aggbug/165013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flustar/" target="_blank">flustar</a> 2007-12-03 21:39 <a href="http://www.tkk7.com/flustar/archive/2007/12/03/builder.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习(fn)W记(十一)—Prototype原型模式http://www.tkk7.com/flustar/archive/2007/12/02/prototype.htmlflustarflustarSun, 02 Dec 2007 08:16:00 GMThttp://www.tkk7.com/flustar/archive/2007/12/02/prototype.htmlhttp://www.tkk7.com/flustar/comments/164650.htmlhttp://www.tkk7.com/flustar/archive/2007/12/02/prototype.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/164650.htmlhttp://www.tkk7.com/flustar/services/trackbacks/164650.html阅读全文

flustar 2007-12-02 16:16 发表评论
]]>
设计模式学习(fn)W记(?—Factory Method模式http://www.tkk7.com/flustar/archive/2007/11/29/factoryMethod.htmlflustarflustarThu, 29 Nov 2007 09:41:00 GMThttp://www.tkk7.com/flustar/archive/2007/11/29/factoryMethod.htmlhttp://www.tkk7.com/flustar/comments/164056.htmlhttp://www.tkk7.com/flustar/archive/2007/11/29/factoryMethod.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/164056.htmlhttp://www.tkk7.com/flustar/services/trackbacks/164056.html阅读全文

flustar 2007-11-29 17:41 发表评论
]]>
设计模式学习(fn)W记(?—Singleton模式http://www.tkk7.com/flustar/archive/2007/11/28/singleton.htmlflustarflustarWed, 28 Nov 2007 12:39:00 GMThttp://www.tkk7.com/flustar/archive/2007/11/28/singleton.htmlhttp://www.tkk7.com/flustar/comments/163803.htmlhttp://www.tkk7.com/flustar/archive/2007/11/28/singleton.html#Feedback1http://www.tkk7.com/flustar/comments/commentRss/163803.htmlhttp://www.tkk7.com/flustar/services/trackbacks/163803.html 保证一个类只有一个实例,q提供一个访问它的全局讉K炏V?br /> q个模式比较单,下面l出一个例?
public class Singleton {
  private static Singleton instance;
  private Singleton(){
  
  }
  public static Singleton getInstance(){
   if(instance==null)
    instance=new Singleton();
   return instance;
  }
}
q个E序在单U程下运行不?x)有问题Q但是它不能q行在多U程的环境下Q若惌q行在多U程的环境下Q必M改如下:(x)
public class Singleton {
  private static class Instance{
   static final Singleton instance=new Singleton();
  }
  private Singleton(){
  
  }
  public static Singleton getInstance(){
   return Instance.instance;
  }
}
q样做之所以可以,是因为静态的内部cInstance只会(x)被装载一ơ。运行在多线E下的单态设计模式也叫Double-Checked Looking模式?br />

flustar 2007-11-28 20:39 发表评论
]]>
设计模式学习(fn)W记(?—Template Method模式http://www.tkk7.com/flustar/archive/2007/11/28/templateMethod.htmlflustarflustarWed, 28 Nov 2007 12:36:00 GMThttp://www.tkk7.com/flustar/archive/2007/11/28/templateMethod.htmlhttp://www.tkk7.com/flustar/comments/163802.htmlhttp://www.tkk7.com/flustar/archive/2007/11/28/templateMethod.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/163802.htmlhttp://www.tkk7.com/flustar/services/trackbacks/163802.html 《设计模式》一书对Template Method模式是这hq的Q?br />  定义一个操作中法的骨Ӟ而将一些步骤gq到子类中。不改变法的结构而重新定义它的步骤?br />  我的理解Q定义一个抽象类或者说接口Q在它的内部定义一些抽象的Ҏ(gu)Q供TemplateMethod调用的步骤)和一个TemplateMethodҎ(gu)Q非抽象Ҏ(gu)Q,装了这些抽象方法的接口或抽象类是骨架。而将它的实现延迟到子cMQ也是用子cd现它。不改变法的结构而重新定义它的步骤,也就是改写或者实现父cȝq些非TemplateMethod的抽象方法。下面给Z个例?
abstract class QueryTemplate{
 public void doQuery(){  //Template Method
  formatConnect();
  formatSelect();
 }
  protected abstract void formatConnect();
  protected abstract void formatSelect();
}
class OracleQT extends QueryTemplate{
 public void formatConnect() {
  System.out.println("格式化Qracle数据库连?);
 }
 public void formatSelect() {
  System.out.println("格式化Oracle数据库查?);
 }
}
class MysqlQT extends QueryTemplate{
 public void formatConnect() {
  System.out.println("格式化Mysql数据库连?);
 }
 public void formatSelect() {
  System.out.println("格式化Mysql数据库查?);
 }
}
public class client {
 public static void main(String[] args) {
  QueryTemplate oracleQT=new OracleQT();
  oracleQT.doQuery();
  
  QueryTemplate mysqlQT=new MysqlQT();
  mysqlQT.doQuery();
 }
}
输出l果Q?br /> 格式化Qracle数据库连?br /> 格式化Oracle数据库查?br /> 格式化Mysql数据库连?br /> 格式化Mysql数据库查?br /> 在这个例子中Q我们定义了一个骨架QueryTemplateQ在它的内部定义了一个Template Method,和一些步骤(抽象Ҏ(gu)Q?使用Template Method来调用这些步骤。步骤是在子cM实现的?br /> 结:有时候,?x)遇到由一pd步骤构成的过E需要执行。这个过E从高层ơ上看是相同的,但有些步骤的实现可能不同。正如,查询SQL数据库从高层ơ上看过E是相同的,但某些细节比如如何连接数据库则可能因q_{细节的不同而不同。通过Template Method模式Q我们可以先定义步骤序列Q然后覆盖那些需要改变的步骤?/p>

 



flustar 2007-11-28 20:36 发表评论
]]>
设计模式学习(fn)W记(?—Observer观察者模?/title><link>http://www.tkk7.com/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.tkk7.com/flustar/archive/2007/11/28/observer.html</guid><wfw:comment>http://www.tkk7.com/flustar/comments/163801.html</wfw:comment><comments>http://www.tkk7.com/flustar/archive/2007/11/28/observer.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flustar/comments/commentRss/163801.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flustar/services/trackbacks/163801.html</trackback:ping><description><![CDATA[<p> 《设计模式》一书对Observer是这hq的Q?br /> 定义对象间的一U一对多的依赖关p,当一个对象的状态发生改变时Q所有依赖于它的对象都将得到通知q自动更新?br /> 举个例子Q在现实生活中,父母与孩子是最亲密的h。父母做为孩?被观察?的监护hQ观察者),当孩子和别h打架后,一定会(x)告诉他的父母qg事(呵呵Q当孩子很小Ӟ通常?x)告诉父母,长大了以后,可能不?x)Q这里的孩子指的是小孩子Q?当孩子获得奖学金后,也一定会(x)告诉他的父母。下面我用Observer实现q个E序。代码如?<br /> import java.util.Vector;</p> <p>class Children{<br />  static private Vector<Observer> obs;<br />  static private String state=null;<br />  static{<br />   obs=new Vector<Observer>();<br />  }<br />  public static void attach(Observer o){<br />   obs.addElement(o);<br />  }<br />  public static void detach(Observer o){<br />   obs.removeElement(o);<br />  }<br />  public void setState(String str){<br />   state=str;<br />  }<br />  public String getState(){<br />   return state;<br />  }<br />  public void notifyObs(){<br />   for(Observer o:obs){<br />    o.update(this); <br />   }<br />  }<br /> }<br /> interface Observer{<br />  public void update(Children child);<br /> }<br /> class Parent implements Observer{<br />  public void update(Children child){<br />   if(child.getState().equals("fight")){<br />    System.out.println("ParentQ他和别人打架了");<br />   }else if(child.getState().equals("scholarship")){<br />    System.out.println("告诉Parent,他得C奖学?);<br />   }<br />  }<br /> }<br /> class Mother implements Observer{<br />  public void update(Children child){<br />   if(child.getState().equals("fight")){<br />    System.out.println("告诉MotherQ他和别人打架了");<br />   }else if(child.getState().equals("scholarship")){<br />    System.out.println("告诉Mother,他得C奖学?);<br />   }<br />  }<br /> }<br /> public class Client {</p> <p> public static void main(String[] args) {<br />   Children child=new Children();<br />   Observer parent=new Parent();<br />   Observer mother=new Mother();<br />   child.attach(parent);<br />   child.attach(mother);<br />   child.setState("fight");<br />   child.notifyObs();<br />   child.setState("scholarship");<br />   child.notifyObs();</p> <p> }</p> <p>}</p> <p>输出如下:<br /> 告诉ParentQ他和别人打架了<br /> 告诉MotherQ他和别人打架了<br /> 告诉Parent,他得C奖学?br /> 告诉Mother,他得C奖学?br />  结Q对于Observer模式Q触发事件的对象-Subject对象无法预测可能需要知道该事g的所有对象。ؓ(f)了解册一问题Q我们创Z个Observer接口Q要求所有的Observer负责自己注册到Subject上?br /> </p> <img src ="http://www.tkk7.com/flustar/aggbug/163801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flustar/" target="_blank">flustar</a> 2007-11-28 20:34 <a href="http://www.tkk7.com/flustar/archive/2007/11/28/observer.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习(fn)W记(?—Decorator装饰模式http://www.tkk7.com/flustar/archive/2007/11/28/decorator.htmlflustarflustarWed, 28 Nov 2007 12:31:00 GMThttp://www.tkk7.com/flustar/archive/2007/11/28/decorator.htmlhttp://www.tkk7.com/flustar/comments/163800.htmlhttp://www.tkk7.com/flustar/archive/2007/11/28/decorator.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/163800.htmlhttp://www.tkk7.com/flustar/services/trackbacks/163800.html《设计模式》一书对Decorator是这hq的Q?br />  动态地l一个对象添加一些额外的职责。就增加功能来说QDecorator模式比生成子cL为灵zR?br /> 也就是说Q动态地l对象添加一些额外的功能。它的工作原理是Q创Z个始于Decorator对象Q负责新功能的对象)l止于原对象的一个对象的“?#8221;。例如,我们要ؓ(f)市的收银台设计一个打印票据的E序Q有的需要打印票据的头信息,有的需要打印票据的脚信息Q有的只需要打印票据的内容。如果针Ҏ(gu)一U情况都修改一ơ程序,势必?x)很ȝ。这时我们可以考虑使用Decorator模式。其l构cd如下Q?br />  

代码如下Q?br /> abstract class Component{
 abstract public void printTicket();
}
class SalesTicket extends Component{
 public void printTicket() {
  System.out.println("打印出salesTicket的内?);
 }
}
abstract class TicketDecorator extends Component{
 private Component myTrailer;
 public TicketDecorator(Component myComponent){
  myTrailer=myComponent;
 }
 public void callTrailer(){
  if(myTrailer!=null)
   myTrailer.printTicket();
 }
}
class Header extends TicketDecorator{
 public Header(Component myComponent){
  super(myComponent);
 }
 public void printTicket(){
  System.out.println("打印salesTicket的头信息");
  super.callTrailer();
  
 }
}
class Footer extends TicketDecorator{
 public Footer(Component myComponent){
  super(myComponent);
 }
 public void printTicket(){
  super.callTrailer();
  System.out.println("打印salesTicket的页脚信?);
 }
}
public class Client {

 public static void main(String[] args) {
  System.out.println("====================================");
  new Header(new Footer(new SalesTicket())).printTicket();
  System.out.println("====================================");
  new Footer(new Header(new SalesTicket())).printTicket();
  System.out.println("====================================");
 }

}
输出l果如下:
====================================
打印salesTicket的头信息
打印出salesTicket的内?br /> 打印salesTicket的页脚信?br /> ====================================
打印salesTicket的头信息
打印出salesTicket的内?br /> 打印salesTicket的页脚信?br /> ====================================
从这个例子我们可以看出,Decorator模式把问题分Z部分Q?br /> 1Q?nbsp;如何实现提供新功能的对象?br /> 2Q?nbsp;如何为每U特D情늻l对象?br /> q样能够Decorator对象的实C军_如何使用Decorator的对象分d来,从而提高了内聚性,因ؓ(f)每个Decorator对象只用兛_自己d的功能,无需兛_自己是如何被加入到对象链中。还可以L地重排Decorator的顺序,无需改变其Q何代码?br /> 结QDecorator模式的适用场合是,各种可选的功能在另一个肯定要执行的功能之前或之后执行?/p>

 



flustar 2007-11-28 20:31 发表评论
]]>
设计模式学习(fn)W记(?—Abstract Factory抽象工厂模式http://www.tkk7.com/flustar/archive/2007/11/28/abstractFactory.htmlflustarflustarWed, 28 Nov 2007 12:23:00 GMThttp://www.tkk7.com/flustar/archive/2007/11/28/abstractFactory.htmlhttp://www.tkk7.com/flustar/comments/163799.htmlhttp://www.tkk7.com/flustar/archive/2007/11/28/abstractFactory.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/163799.htmlhttp://www.tkk7.com/flustar/services/trackbacks/163799.htmlGOF《设计模式》一书对Abstract Factory模式是这hq的:

    为创Zl相x怺依赖的对象提供一个接口,而且无需指定它们的具体类?br />   大致意思是_(d)(x)我们在创些对象的时候,q不需要指定它们的具体c,q些具体cȝ对象是由工厂对象负责实例化的。下面是《Design Patterns Explained》一书的例子Q有兌机pȝ的显C和打印E序Q用来显C和打印的分辨率取决于当前运行的pȝ。低端机使用低分辨率的显C和打印驱动E序Q高端机使用高分辨率的显C和打印驱动E序。其l构囑֦下:(x)


代码如下:

abstract class ResFactory{

    abstract public DisplayDriver getDisplayDrvr();

    abstract public PrintDriver getPrintDrvr();

}

class LowResFact extends ResFactory{

    public DisplayDriver getDisplayDrvr() {

        returnnew LRDD();

    }

    public PrintDriver getPrintDrvr() {

        returnnew LRPD();

    }

   

}

class HighResFact extends ResFactory{

    public DisplayDriver getDisplayDrvr() {

        returnnew HRDD();

    }

    public PrintDriver getPrintDrvr() {

        returnnew HRPD();

    }

   

}

abstract class DisplayDriver{

   

}

abstract class PrintDriver{

}

class HRDD extends DisplayDriver{
    
public HRDD() {
        
System.out.println("使用高端机的昄驱动E序")
 } 

}

class LRDD extends DisplayDriver{

    public LRDD(){

        System.out.println("使用低端机的昄驱动E序");

    } 

}

class HRPD extends PrintDriver{

    public HRPD() {

        System.out.println("使用高端机的打印驱动E序");

    }

   

}

class LRPD extends PrintDriver{

    public LRPD() {

        System.out.println("使用低端机的打印驱动E序");

    } 

}

public class ApControl {

    public static ResFactory getResFactory(ResFactory factory){

        return factory;

    }

    public static void main(String[] args) {

        ResFactory highResFact=ApControl.getResFactory(new HighResFact());

        highResFact.getDisplayDrvr();

        highResFact.getPrintDrvr();

        ResFactory lowResFact=ApControl.getResFactory(new LowResFact());

        lowResFact.getDisplayDrvr();

        lowResFact.getPrintDrvr();

    }

}输出l果Q?/span>

使用高端机的昄驱动E序

使用高端机的打印驱动E序

使用低端机的昄驱动E序

使用低端机的打印驱动E序

    在这个例子中ApControl使用z自两个不同的服务c?DisplayDriver和PrintDriver)的对象。这个设计非常简化,隐藏了实现细节,pȝ的可l护性也更好。ApControl不知道自己拥有的服务对象的那个特定具体实玎ͼ因ؓ(f)创徏对象是工厂的职责。ApControl也不知道自己使用的是哪个特定工厂Q因为它只知道自己有一个ResFactory对象。它可能是一个HighResFact也可能是一个LowResFactQ但它不知道到底是哪一个?/span>

    结Q在必须协调一l对象的创徏Ӟ可以应用Abstract Factory模式。它提供了一U方式,如何执行对象实例化的规则从使用q些对象的客户对象中提取出来。首先,扑և实例化的规则Q定义了一个带接口的抽象类Q其中的接口为每U需要实例化的对象提供一个方法。然后,从这个类为每个组实现具体cR最后,由客户对象决定用具体工厂来创徏所需的对象。它主要适用于以下几U情?

1)     一个系l要独立于它的品的创徏、组合和表示时?/span>

2)    可以对系l进行配|,以便pȝ可以使用多个产品pd中的某一个?/span>

3)    当需要强调一pd相关产品对象的设计以便进行联合用时?/span>

4)    当希望提供一个品类库,而只xCZ们的接口而不是实现时?/span>



flustar 2007-11-28 20:23 发表评论
]]>
设计模式学习(fn)W记(?—Bridge桥接模式http://www.tkk7.com/flustar/archive/2007/11/28/bridge.htmlflustarflustarWed, 28 Nov 2007 07:48:00 GMThttp://www.tkk7.com/flustar/archive/2007/11/28/bridge.htmlhttp://www.tkk7.com/flustar/comments/163710.htmlhttp://www.tkk7.com/flustar/archive/2007/11/28/bridge.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/163710.htmlhttp://www.tkk7.com/flustar/services/trackbacks/163710.html   《设计模式》一书对Bridge是这hq的Q?/span>

抽象与其实现解耦,使它们都可以独立地变化?/span>

大致意思是_(d)(x)一l实C另一l用他们的对象分离。这里的实现指的是抽象类?qing)?/span>

zcȝ来实现自q对象Q而不是抽象类的派生类Q这些派生类被称为具体类Q。下?/span>

是《Design Patterns Explained》书中的例子。其l构囑֦下:(x)
  

下面是它的实玎ͼ(x)

abstract class Shape{

    protected Drawing myDrawing;

    abstract public void draw();

    Shape(Drawing drawing){

        myDrawing=drawing;

    }

    protected void drawLine(){

        myDrawing.drawLine();

    }

    protected void drawCircle(){

        myDrawing.drawCircle();

    }

}

class Rectangle extends Shape{

    public Rectangle(Drawing darw){

        super(darw);

    }

    public void draw(){

        drawLine();

        drawLine();

        drawLine();

        drawLine();

    }

}

 class Circle extends Shape{

    public Circle(Drawing draw){

        super(draw);

    }

    publicvoid draw(){

        myDrawing.drawCircle();

    }

}

abstract class Drawing{

    abstract public void drawLine();

    abstract public void drawCircle();

}

class V1Drawing extends Drawing{

    public void drawLine(){

        DP1.draw_a_line();

    }

    public void drawCircle(){

        DP1.draw_a_circle();

    }

}

class V2Drawing extends Drawing{

    public void drawLine(){

        DP2.drawLine();

    }

    public void drawCircle(){

        DP2.drawCircle();

    }

}

class DP1{

    public static void draw_a_line(){

        System.out.println("使用DP1的draw_a_line()ȝ");

    }

    public static void draw_a_circle(){

        System.out.println("使用DP1的draw_a_circle()d");

    }

}

class DP2{

    public static void drawLine(){

        System.out.println("使用DP2的drawLine()ȝ");

    }

    public static void drawCircle(){

        System.out.println("使用DP2的drawCircle()d");

    }

}

 public class BridgeClient {

    public static void main(String[] args) {

        Drawing draw1=new V1Drawing();

        Drawing draw2=new V2Drawing();

        Shape shape1=new Rectangle(draw1);

        shape1.draw();

        Shape shape2=new Circle(draw2);

        shape2.draw();

    }

}

输出l果如下Q?/span>

使用DP1?/span>draw_a_line()ȝ

使用DP1?/span>draw_a_line()ȝ

使用DP1?/span>draw_a_line()ȝ

使用DP1?/span>draw_a_line()ȝ

使用DP2?/span>drawCircle()d

在这个例子中Shape对象实际上是一?/span>Retangle?/span>Circle对象Q?/span>?/span>Clientq不知道到底是那?/span>Q?/span>因ؓ(f)它们看v来都一栗?/span>Drawing实际上是一?/span>V1Drawing?/span>V2Drawing,?/span>Shape对象q知道到底是哪个Q?/span>因ؓ(f)它们看v来都一栗DP1或DP2使用它的Drawing对象知道是哪一个。Shape是事物的抽象QDrawing是实现或者操作事物方法的抽象。他们两个都可以独立地变化。正如例子中所说那P我们可以输出一个矩形可以用V1Drawing也可以用V2Drawing来完成,输出一个圆形也是一样都有两U方法。Bridge模式遵@了设计模式中两条基本{略Q找出变化ƈ装之和优先使用对象聚集Q而不是类l承?/span>

    结QBridge模式是一U抽象与其实现相分离的模式。它主要应用于:(x)当事物是一l变化量Q和对这些事物的操作Ҏ(gu)(实现)也是一l变化量的情况,也就是说它们都是多变的?/span>



flustar 2007-11-28 15:48 发表评论
]]>
设计模式学习(fn)W记(??Strategy{略模式http://www.tkk7.com/flustar/archive/2007/11/23/strategy.htmlflustarflustarFri, 23 Nov 2007 10:43:00 GMThttp://www.tkk7.com/flustar/archive/2007/11/23/strategy.htmlhttp://www.tkk7.com/flustar/comments/162707.htmlhttp://www.tkk7.com/flustar/archive/2007/11/23/strategy.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/162707.htmlhttp://www.tkk7.com/flustar/services/trackbacks/162707.htmlGOF《设计模式》一书对Strategy模式是这hq的:

    定义一pd的算法,把他们一个个装hQƈ且它们可相互替换。Strategy模式使算法可独立于用它的客戯变化?/span>

    Strategy模式以下列几条原则ؓ(f)基础Q?/span>

1Q?nbsp;每个对象都是一个具有职责的个体?/span>

2Q?nbsp;q些职责不同的具体实现是通过多态的使用来完成的?/span>

3Q?nbsp;概念上相同的法h多个不同的实玎ͼ需要进行管理?/span>

下面我将通过一个实例来说明它的具体使用Q这个例子是关于数据库连接的。代码如下:(x)

interface DatabaseStrategy{

    public void process();

}

class MysqlDBStrategy implements DatabaseStrategy{

    public void process() {

       System.out.println("处理Mysql数据库连?/span>");

    }

}

class OracleDBStrategy implements DatabaseStrategy{

    public void process() {

       System.out.println("处理Oracle数据库连?/span>");

    }

}

class DataBaseManager{

    public void process(DatabaseStrategy dbStrategy){

       dbStrategy.process();

    }

}

publicclass StrategyClient {

    public static void main(String[] args) {

       MysqlDBStrategy mysql=new MysqlDBStrategy();

       DataBaseManager manager=new DataBaseManager();

       manager.process(mysql);

       OracleDBStrategy oracle=new OracleDBStrategy();

       manager.process(oracle);

    }

}

    在我们的实际~程中经怼(x)遇到pȝ要连接的数据库可能不只一U,如果采用传统的方法,即修改连接Url的方法,q种Ҏ(gu)实可行Q但是有一个问题要l常修改源代码,不利于以后的l护Q那么有没有一U更好的Ҏ(gu)呢?{案是有Q用Strategy模式Q首先定义一个连接数据库通用的接口(在上面的例子中是DatabaseStrategyQ?然后再定义实现该接口的具体类(MysqlDBStrategy、OracleDBStrategy)Q在q些具体c,实现具体的逻辑。最后再定义一个管理数据库q接的类(DataBaseManager),它的内部有一个方法可以接受具体类实例的参数。我们可以看到这个参数是DatabaseStrategycd的,也就是说它可以接受Q何一个实CDatabaseStrategy接口的类的具体实例(q里q用了对象替换机Ӟ多态的一U)Q从而完成数据库q接的处理。如果我们还需要处理另外一U数据库如sqlserverQ我们只需要徏立一个SqlserverDBStrategycd现DatabaseStrategy接口Q把该类的实例传lDatabaseManager的processҎ(gu)卛_?/span>

    结QStrategy模式是一U定义一pd法的方法。概念上看,q些法完成的都是相同的工作Q只是实C同?/span>

flustar 2007-11-23 18:43 发表评论
]]>
设计模式学习(fn)W记(??Adapter适配器模?/title><link>http://www.tkk7.com/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.tkk7.com/flustar/archive/2007/11/23/adapter.html</guid><wfw:comment>http://www.tkk7.com/flustar/comments/162706.html</wfw:comment><comments>http://www.tkk7.com/flustar/archive/2007/11/23/adapter.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flustar/comments/commentRss/162706.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/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模式是这hq的Q?br />   </span><span style="font-family: 宋体"> </span><span style="font-family: 宋体">一个类的接口{换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的cd以一起工作?/span></p> <p><span style="font-family: 宋体">    </span><span style="font-family: 宋体">q段话大致是_(d)(x)我们需要一U方式,Z个功能正但接口不合的对象创Z个新接口。例如,客户l我们如下需求:(x)</span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">1Q?nbsp;</span><span style="font-family: 宋体">为都?#8220;昄”(display)行ؓ(f)的点、线、正方Ş分别创徏cR?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">2Q?nbsp;</span><span style="font-family: 宋体">客户对象不必知道自己到底拥有炏V线、还是正方Ş。它只需知道拥有q些形状中的一个?/span></p> <p><span style="font-family: 宋体">也就是说Q我们要用一个更高层ơ的概念这些具体Ş犉늛q去Q这个高层概念可以称为:(x)“可显C的形状”。因此,我们需要创Z个接口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'">    </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: 宋体">现在客户忽然间有让我们给q个pȝ增加一个画圆的功能。这个看h很简单,只需定义一?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Circle</span><span style="font-size: 10pt; color: black; font-family: 宋体">cL实现</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">Shape</span><span style="font-size: 10pt; color: black; font-family: 宋体">接口Q但是我们要l它~写</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">display</span><span style="font-size: 10pt; color: black; font-family: 宋体">Ҏ(gu)Q这可不是g单的事,假如此时我们正好发现一?/span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">XXCircle</span><span style="font-size: 10pt; color: black; font-family: 宋体">c,它有一个方法刚好可以完成这个功能,那么有没有更好的Ҏ(gu)来利用它呢,q时我们p用到</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: 宋体">代码如下Q?/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'">    </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'">       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: 宋体">d</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'">    }</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'">    Adapter</span><span style="font-size: 10pt; color: black; font-family: 宋体">模式有两U类型:(x)</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'">    </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: 宋体">模式Q它依赖于一个对象(适配器)包含另一个对?/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'">    </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'">    </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'">    </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'">    }</span></p> <p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">    </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'">       </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(); </span></p> <p style="text-align: left" align="left"><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'">}</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'">    </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'">       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'">       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'">       <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'">    }</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'">     </span></span><span style="font-family: 宋体">cAdapter模式Q它是通过多重l承来实现的Qjava中没有多l承Q是通过接口来实现的Q?/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'">    </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'">       </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();   </span></p> <p style="text-align: left" align="left"><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'">}</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'">    </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'">       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'">       cc.display();</span></p> <p style="text-align: left" align="left"><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'">}</span></p> <p><span style="font-family: 宋体">    </span><span style="font-family: 宋体">结QAdapter模式是一个很常用的模式,它将一个(或多个)cȝ接口转换成我们需要类所具备的一个接口。它的实现方式是Q创Z个具备所需接口的类Q然后包装原有类的方法,q样实际上就包含了被适配的对象。它主要适用于以下几U情况:(x)</span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">1Q?nbsp;</span><span style="font-family: 宋体">你希望用他人编写的子程序或Ҏ(gu)Q因Z需要它所执行的功能?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">2Q?nbsp;</span><span style="font-family: 宋体">你无法将q个子程序直接加入程序中?/span></p> <p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-family: 宋体">3Q?nbsp;</span><span style="font-family: 宋体">子程序的接口或调用方式与需要用它的相兛_象不完全相同?/span></p> <img src ="http://www.tkk7.com/flustar/aggbug/162706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flustar/" target="_blank">flustar</a> 2007-11-23 18:40 <a href="http://www.tkk7.com/flustar/archive/2007/11/23/adapter.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式学习(fn)W记(一)--Facade外观模式http://www.tkk7.com/flustar/archive/2007/11/23/facade.htmlflustarflustarThu, 22 Nov 2007 17:45:00 GMThttp://www.tkk7.com/flustar/archive/2007/11/23/facade.htmlhttp://www.tkk7.com/flustar/comments/162506.htmlhttp://www.tkk7.com/flustar/archive/2007/11/23/facade.html#Feedback0http://www.tkk7.com/flustar/comments/commentRss/162506.htmlhttp://www.tkk7.com/flustar/services/trackbacks/162506.html《设计模式》一书对Facade模式是这hq的:

       为子pȝ中的一l接口提供一个统一接口?/span>Facade模式定义了一个更高层的接口,使子pȝ更加Ҏ(gu)使用?/span>

       大致意思是_(d)(x)使用一U比原有方式更简单的办法与系l交互。例如,我们把一个很文g的文Ӟ攑֜了第二抽屉里Q而第二个抽屉的钥匙放在了W一个抽屉里Q我们要惛_个文ӞW一步肯定要拿到W一个抽屉的钥匙Q然后打开它再拿出W二个抽屉的钥匙Q最后打开W二个抽屉取出文件?/span>

       我就上面说的那个情Ş写一下实C码,首先我们要实C个子pȝ,呵呵Q把抽屉比喻成系l,有点夸张了(DrawerOne?/span>DrawerTwoQ:(x)

class DrawerOne {

    public void open(){

       System.out.println("W一个抽屉被打开?/span>");

       getKey();

    }

    public void getKey(){

       System.out.println("得到W二个抽屉的钥匙");

    }

}

class DrawerTwo{

    public void open(){

       System.out.println("W二个抽屉被打开?/span>");

       getFile();

    }

    public void getFile(){

       System.out.println("得到q个重要文g");

    }

}

public class Client{

    public static void main(String []args){

       DrawerOne darwerOne=new DrawerOne();

       DrawerTwo darwerTwo=new DrawerTwo();

       darwerOne.open();

       darwerTwo.open();

    }

}

׃没有使用Façade模式Q可以看到要惛_到这个文件要首先打开W一个抽屉,然后再打开W二个抽屉,在我们实际所开发的pȝ中,有时候客戯实现某一操作Qƈ不需要知道实现这一操作的详l步骤,而是单地点击某一个按钮就可以得到自己惌的结果。下面对上面的代码?/span>Façade模式q行改进Q徏立一?/span>FacadeDrawerc:(x)

class DrawerFacade{

    DrawerOne darwerOne=new DrawerOne();

    DrawerTwo darwerTwo=new DrawerTwo();

    public void open(){

       darwerOne.open();

       darwerTwo.open();

    }

}

修改Clientc:(x)

public class DrawerClient{

    public static void main(String []args){

       DrawerFacade drawer=new DrawerFacade();

       drawer.open();

    }

}

输出l果如下Q?/span>

W一个抽屉被打开?/span>

得到W二个抽屉的钥匙

W二个抽屉被打开?/span>

得到q个重要文g

正如上面所_(d)客户?/span>clientQ它q不需要关心子pȝQ而是兛_DrawerFacade所留下来的和外部交互的接口Q而子pȝ?/span>DrawerFacade的聚合?/span>

以上只是个h拙见Q哪里有不正的地方Q希望大家多多批评指正?/span>^_^

    Facade模式主要适用于以下几U情?/span>:

1)    不需要用一个复杂系l的所有功能,而且可以创徏一个新的类Q包含访问系l的所有规则。如果只需要用系l的部分功能Q那么你为新cL创徏?/span>API比原系l的API单的多?/span>

2)    希望装或者隐藏系l原pȝ?/span>

3)    希望使用原系l的功能Q而且q希望增加一些新的功能?/span>

4)    ~写新类的成本小于所有h学会(x)使用或者未来维护原pȝ上所需的成本?/span>



flustar 2007-11-23 01:45 发表评论
]]>
վ֩ģ壺 Ƶ | ɫվ| һ| ޹˾Ʒվ| ëƬѹۿ| 999zyz**վëƬ| ۺɫAPP| ߹ۿ˳վҹ| һƬƵ| ĻۺϾþ2| ҰƵѹۿ| Ӱ߹ۿѸ| 77777ҹ| ˳ɫ7777߹ۿ| ˳Ƶ| 91Ƶ| þþƷavƷ| һҳ| AëƬþð| 999ھƷѹۿ| һëƬaaѹۿ| ѹۿվ| avһĦ| ˳ɵӰԺ߹ۿ| þ޾ƷĻ| ߹ۿ˳վ| ѹۿڵwwwƵ| һѹۿ| ۺһ| ŷղ| ŷղwww| ҹƬ߹ۿ| Ʒһѿ| ޾Ʒ͵Բ| ޲avĻ| ձ߿Ƭ| ؼëƬѹۿƵ| Ƶ߹ۿƵ| ձ߹ۿƵ| ŮƵ| ҹѸþӰԺ|