HeadFirst 设计模式笔记(七)—— 适配器模式与外观模式
来源:互联网 发布:java网站访问量统计 编辑:程序博客网 时间:2024/05/17 04:26
适配器模式(Adapter):可以想想现实生活中的转换插头。适配器是一个中间层,能将类的接口转换成想要的接口。这与前文中的装饰者模式有点像,不过装饰者模式是赋予接口新的功能,而适配器模式则把接口转换成需要的样子。
我的理解比较简单:假设我们手头有两个接口A和B。有一个类C需要使用接口B的方法,但是在某些情况下接口A中的一些功能更适合C,此时我们定义一个适配器类,包含一个A的对象,并用它实现B的接口。然后我们把这个适配器传给C。这样对于C来说它依然只调用B中的方法,但是实际上这些方法是由A的对象实现的。适配器起到一个中间人的角色。
书中举了一个JAVA的例子:早期java 的集合类都实现了Enumeration接口,但是某一版本后的集合类改为实现Iterator接口。比起Enumeration,Iterator除了提供遍历元素的功能还提供了remove功能。
现在的问题是,很多旧代码使用了Enumeration,而我们现在在新代码中只希望用到Iterator,此时我们可以使用一个适配器。代码大略是这样:
public class EnumerationIterator implements Iterator { Enumeration enumeration; public EnumerationIterator(Enumeration enumeration) { this.enumeration = enumeration; } public boolean hasNext() { return enumeration.hasMoreElements(); } public Object next() { return enumeration.nextElement(); } public void remove() { throw new UnsupportedOperationException(); }}
请注意对于remove的处理。
还有一个模式能改变接口,但是目的是把一系列操作隐藏起来,只提供用户感兴趣的功能调用。它就是外观模式(facade pattern)。
比如要实现看dvd的操作,需要打开电视机,打开影碟机,调整音量等等,很多步骤。我们可以将这一系列操作使用外观模式整合(使用组合的方式,及外观类中包含涉及到的所有对象:电视机,影碟机等等)到一起,然后只提供一个“看dvd”的接口供用户调用就好了。这让我想起了MVC模式,总之是添加了一个业务逻辑层来简化操作,并且使客户与实际设备解耦(比如如果电视升级了,操作有所改变,我们只需要更改外观类中的代码,而不必烦扰客户调用了)。
设计原则:最少知识原则,只调用与自己最亲密的对象的方法。如果在一个方法中,对象O是调用方法M的返回结果,那么尽量不要调用O的方法,因为这会产生对其它对象的子部分的依赖。此时,最好能在M中提供一个更直接的方法。
- HeadFirst 设计模式笔记(七)—— 适配器模式与外观模式
- HeadFirst 设计模式 7适配器模式与外观模式
- 《Head First 设计模式》阅读笔记(七)——适配器和外观模式
- HeadFirst 设计模式学习笔记7--适配器模式和外观模式
- HeadFirst 设计模式学习笔记7--适配器模式和外观模式
- HeadFirst设计模式学习笔记4-适配器模式&外观模式
- HeadFirst 设计模式学习笔记6--适配器模式和外观模式
- 设计模式--适配器模式与外观模式
- 设计模式-适配器模式与外观模式
- 设计模式(七)The Adapter and Facade Pattern 适配器模式与外观模式
- HeadFirst设计模式--适配器模式
- 设计模式笔记(六)--适配器模式、外观模式
- 设计模式(适配器模式,外观模式)
- 《HeadFirst设计模式》书摘-单例/命令/适配器/外观
- 设计模式之适配器与外观模式
- HeadFirst 设计模式笔记(四)—— 工厂模式
- HeadFirst 设计模式笔记(六)—— 命令模式
- HeadFirst 设计模式笔记(四)—— 工厂模式
- file模式访问网页时iframe高度自适应
- struts2 跳转
- Makefile学习教程: 跟我一起写 Makefile
- Unity NGUI使用总结
- 如何修改Mac截屏保存路径
- HeadFirst 设计模式笔记(七)—— 适配器模式与外观模式
- java 组件技术
- Linux环境进程间通信-共享内存
- Java变量的初始化问题探究
- PEAR LOG日志系统
- Android中Bitmap,byte[],Drawable相互转化
- android 4.0联系人分析—查找匹配
- emacs下C/C++自动补全,Yasnippet && auto-complete && auto-complete-clang-async
- vc++中如何将wchar_t宽字符写入文本文件