HeadFirst 设计模式笔记(七)—— 适配器模式与外观模式

适配器模式(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中提供一个更直接的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值