锁定老帖子 主题:了解适配器模式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-08
最后修改:2008-12-08
楼主的例子中,使用了类继承得到Bread.
在设计模式的三大原则中:违反了第二原则。因此个人认为,楼主这个实现方法,会严重影响到对适配器模式的深入理解。事实上,看UML图,类Adapter 与类Adaptee是依赖关系,而Adapter中的request方法的注释,更明确的指出,在这个方法里调用了adapter对象的SpecitcRequest方法。 设计模式几大原则:(出自李建忠讲义) ================================ • 针对接口编程,而不是针对实现编程 – 客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望 的接口。 • 优先使用对象组合,而不是类继承 – 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。继承在某种程度 上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合的对 象具有良好定义的接口,耦合度低。 • 封装变化点 – 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行 修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。 • 使用重构得到模式——设计模式的应用不宜先入为主,一上来就使用 设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷 软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好 的使用设计模式的方法。 ================================== 我所举的是对象组合,而非类继承。 也许有人会认为我所举的,没有针对接口,这里简化了。(它在我的认知世界体系中,支撑着对框架的理解) |
|
返回顶楼 | |
发表时间:2008-12-09
最后修改:2008-12-09
yunhaifeiwu 写道 楼主的例子中,使用了类继承得到Bread.
在设计模式的三大原则中:违反了第二原则。因此个人认为,楼主这个实现方法,会严重影响到对适配器模式的深入理解。事实上,看UML图,类Adapter 与类Adaptee是依赖关系,而Adapter中的request方法的注释,更明确的指出,在这个方法里调用了adapter对象的SpecitcRequest方法。 设计模式几大原则:(出自李建忠讲义) ================================ • 针对接口编程,而不是针对实现编程 – 客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望 的接口。 • 优先使用对象组合,而不是类继承 – 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。继承在某种程度 上破坏了封装性,子类父类耦合度高;而对象组合则只要求被组合的对 象具有良好定义的接口,耦合度低。 • 封装变化点 – 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行 修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。 • 使用重构得到模式——设计模式的应用不宜先入为主,一上来就使用 设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷 软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好 的使用设计模式的方法。 ================================== 我所举的是对象组合,而非类继承。 也许有人会认为我所举的,没有针对接口,这里简化了。(它在我的认知世界体系中,支撑着对框架的理解) 讲得很好,严重同意! 而楼主的例子看起来不是适配器模式阿,适配器模式是要组合来实现的 |
|
返回顶楼 | |
发表时间:2008-12-09
adapter, proxy, facade有什么异同呢?
|
|
返回顶楼 | |
发表时间:2008-12-09
楼主举的这个例子 十分的不好 可能用不恰当来说 最合适
就比如说 说话都有 有歧义的时候 你举的这个例子 就有歧义~ 你说的这个东西 我觉得就是 时下 什么 jsf啊 Spring之类里面 提到的 Ioc 反转控制 依赖注入之类的东西~ |
|
返回顶楼 | |
发表时间: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应该是并列关系,不应该是继承关系,不应该为了获得某个类的方法,就继承那个类。比如:想使用工具类中的方法,就去继承工具类,这是不对的。 |
|
返回顶楼 | |
发表时间:2008-12-10
刚才看了一些适配器模式的资料。LZ写的例子是对的。这是类的适配器模式,而不是对象的适配器模式。我之前了解的都是对象的适配器模式。刚刚了解到,类的适配器模式有一个缺点,即要适配的类不是一个,而是多个的时候。用类的适配器模式就没发实现了。因为只能继承一个类。(不过我个人感觉,继承一个类,只是为了得到它里面的方法,感觉怪怪的。还是对象适配器模式容易理解一些。)
|
|
返回顶楼 | |
发表时间:2008-12-11
谢谢大家的意见,让我领悟不少
|
|
返回顶楼 | |
发表时间:2008-12-13
最后修改:2008-12-13
要了解适配器模式,可以看看java.io包,像InputStreamWriter这些类都是适配器的典型例子,简单来说就是让InputStream拥有Writer接口的方法
|
|
返回顶楼 | |
发表时间:2008-12-14
你好我是初学者也是才在这个网站上注册的。我想问下Makecake m=new Makecake();然后就可以调用下面的方法了。m.makeBread();
m.makeCake();是不是用子类对象就是父类对象实现的?我是初学者,请回复下。讲的越明白越好。 |
|
返回顶楼 | |
发表时间: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 强调:对象注入要认真研究揣磨。什么访问者模式、命令模式、职责链模式、组合模式、观察者模式等,从实现角度上看,基本可分成:对象注入+数据结构。事实上"对象注入+数据结构"能弄出千变万化的模式出来。 以上是个人观点,仅供参考。 |
|
返回顶楼 | |