论坛首页 Java企业应用论坛

了解适配器模式

浏览 10616 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-08   最后修改:2008-12-08
    楼主的例子中,使用了类继承得到Bread.

     在设计模式的三大原则中:违反了第二原则。因此个人认为,楼主这个实现方法,会严重影响到对适配器模式的深入理解。事实上,看UML图,类Adapter 与类Adaptee是依赖关系,而Adapter中的request方法的注释,更明确的指出,在这个方法里调用了adapter对象的SpecitcRequest方法。

    设计模式几大原则:(出自李建忠讲义)
================================
• 针对接口编程,而不是针对实现编程
– 客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望
的接口。
• 优先使用对象组合,而不是类继承
– 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。继承在某种程度
上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合的对
象具有良好定义的接口,耦合度低。
• 封装变化点
– 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行
修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。
• 使用重构得到模式——设计模式的应用不宜先入为主,一上来就使用
设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷
软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好
的使用设计模式的方法。

==================================
我所举的是对象组合,而非类继承。 也许有人会认为我所举的,没有针对接口,这里简化了。(它在我的认知世界体系中,支撑着对框架的理解)
    
0 请登录后投票
   发表时间:2008-12-09   最后修改:2008-12-09
yunhaifeiwu 写道
    楼主的例子中,使用了类继承得到Bread.

     在设计模式的三大原则中:违反了第二原则。因此个人认为,楼主这个实现方法,会严重影响到对适配器模式的深入理解。事实上,看UML图,类Adapter 与类Adaptee是依赖关系,而Adapter中的request方法的注释,更明确的指出,在这个方法里调用了adapter对象的SpecitcRequest方法。

    设计模式几大原则:(出自李建忠讲义)
================================
• 针对接口编程,而不是针对实现编程
– 客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望
的接口。
• 优先使用对象组合,而不是类继承
– 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。继承在某种程度
上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合的对
象具有良好定义的接口,耦合度低。
• 封装变化点
– 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行
修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。
• 使用重构得到模式——设计模式的应用不宜先入为主,一上来就使用
设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷
软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好
的使用设计模式的方法。

==================================
我所举的是对象组合,而非类继承。 也许有人会认为我所举的,没有针对接口,这里简化了。(它在我的认知世界体系中,支撑着对框架的理解)
    

讲得很好,严重同意!
而楼主的例子看起来不是适配器模式阿,适配器模式是要组合来实现的
0 请登录后投票
   发表时间:2008-12-09  
adapter, proxy, facade有什么异同呢?
0 请登录后投票
   发表时间:2008-12-09  
楼主举的这个例子 十分的不好  可能用不恰当来说 最合适

就比如说  说话都有 有歧义的时候

你举的这个例子 就有歧义~

你说的这个东西  我觉得就是  时下  什么  jsf啊  Spring之类里面 提到的
Ioc  反转控制 依赖注入之类的东西~
0 请登录后投票
   发表时间:2008-12-09  
LZ这个例子不是Adapter模式。而且有问题。

public class MakeCake extends MakeBread implements MakeFactory {  
     public String getCake() {  
         System.out.println("++++++cake++++");  
         return "cake";  
     };  
 } 


这段代码,MakeCake为什么要继承MakeBread呢?难道只是为了获得MakeBread的getBread方法吗?MakeCake和MakeBread应该是并列关系,不应该是继承关系,不应该为了获得某个类的方法,就继承那个类。比如:想使用工具类中的方法,就去继承工具类,这是不对的。
1 请登录后投票
   发表时间:2008-12-10  
刚才看了一些适配器模式的资料。LZ写的例子是对的。这是类的适配器模式,而不是对象的适配器模式。我之前了解的都是对象的适配器模式。刚刚了解到,类的适配器模式有一个缺点,即要适配的类不是一个,而是多个的时候。用类的适配器模式就没发实现了。因为只能继承一个类。(不过我个人感觉,继承一个类,只是为了得到它里面的方法,感觉怪怪的。还是对象适配器模式容易理解一些。)
1 请登录后投票
   发表时间:2008-12-11  
谢谢大家的意见,让我领悟不少
0 请登录后投票
   发表时间:2008-12-13   最后修改:2008-12-13
要了解适配器模式,可以看看java.io包,像InputStreamWriter这些类都是适配器的典型例子,简单来说就是让InputStream拥有Writer接口的方法
0 请登录后投票
   发表时间:2008-12-14  
你好我是初学者也是才在这个网站上注册的。我想问下Makecake m=new Makecake();然后就可以调用下面的方法了。m.makeBread();
m.makeCake();是不是用子类对象就是父类对象实现的?我是初学者,请回复下。讲的越明白越好。
0 请登录后投票
   发表时间:2008-12-14   最后修改:2008-12-14
wuwanli0228 写道
你好我是初学者也是才在这个网站上注册的。我想问下Makecake m=new Makecake();然后就可以调用下面的方法了。m.makeBread();
m.makeCake();是不是用子类对象就是父类对象实现的?我是初学者,请回复下。讲的越明白越好。



你说的这个m.makeCake(),楼主的例子中好像没有这个方法。对于你的提问也就莫名奇妙了。

 public class MakeCake extends MakeBread implements MakeFactory {  
     public String getCake() {  
         System.out.println("++++++cake++++");  
         return "cake";  
     };  
} 


MakeFactory 接口有两种方法  getBread 和 getCake.
上面代码中MakeCake类实现了MakeFactory 接口。要实现一个接口,则必须全部实现接口的方法。

在MakeCake类中,显示实现了getCake方法。而getBread 方法,是由MakeCake的父类(即MakeBread )中的getBread 方法隐示实现。

也就是说,楼主用了继承与接口实现了适配器。但是正如我前面所说的,这种方式是一种不太好的方式,至少会影响对设计模式的深入理解。同时也违反了设计模式的原则,如果不是特殊情况下,这种方式少用为妙。如果是学设计模式,应掌握通过对象注入的实现方式。

==================================================================

下面是给你的参考建议:
1  认真阅读java面向对象的基本概念。弄清继承、接口、对象的含义。在你的提问中,反映出在这些方面还欠缺一些。
2  对于设计模式,你应掌点掌握适配器模式。但楼主这种方式,你只能了解即可。我前面介绍了适配器模式的另一种方式。姑且叫对象注入吧。
3 强调:对象注入要认真研究揣磨。什么访问者模式、命令模式、职责链模式、组合模式、观察者模式等,从实现角度上看,基本可分成:对象注入+数据结构。事实上"对象注入+数据结构"能弄出千变万化的模式出来。

以上是个人观点,仅供参考。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics