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中提供一个更直接的方法。

原创粉丝点击