设计模式之8 -- 适配器模式

适配器模式 学习笔记

有时候我们需要现有的类,但是此类的接口不符合系统的需要,即接口不兼容。那么我们就需要引入适配器类来使得我们目标接口和原来的类接口兼容。

适配器模式定义: 将一个接口转换成客户希望的另一个接口,使得接口不兼容的那些类可以一起工作,其别名为包装器(wrapper)。 适配器模式可以作为类结构型模式,也可以作为对象结构型模式

适配器模式一共有两种情况。一种是类适配器,还有一种是对象适配器。它们之间根本的区别是类适配器中适配器和适配者之前是继承的关系,而对象适配器中适配器和适配者是代理的关系

下面我们先来看对象适配。

从上图中可以看到Adapter类就是我们所说的包装器类,而Adaptee就是被适配者类,客户端需要的接口是request,但是在Adaptee里面只有specificRequest()接口,因此引入Adapter类间接的将客户端的请求转化给Adaptee处理,从Adapter的成员方法可以看出它是直接使用Adaptee的一个引用进行方法调用的。

public interface Target {
    void request(){ };
}

class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter() {
        this.adaptee = new Adaptee();
    }

    public void request() {
        adaptee.specificRequest();
    }
}

class Adaptee {
    void specificRequest(){ };
}
class Client {
    Tartget target = new Adapter();
    target.request();
}

因此客户端直接与目标类打交道,直接调用request方法,执行期间实际上就会调用Adapter.request()进而间接地转化为对Adaptee的调用。

第二种是类适配。

从上图中注意关键的一点,在Adapter适配器类中调用的是和被适配者相同签名的specificRequest()方法。因此在这种情况中Adapter类是继承Adaptee类的(上面说的对象适配是代理关系)。

class Adapter extends Adaptee implements Target {
    public void request() {
        specificRequest();
    }
}

通过将客户端请求的request间接的调用Adaptee.specificRequest()方法。

另外还有一种缺省适配器模式,当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中的每个方法提供一个默认实现(空方法),那么该抽象类的字类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。

建议多使用对象适配器,少使用类适配器

总结:
适配器模式实现了将现有接口转化为客户类期望的接口,实现了对现有类的复用。另外在适配器中可以调用自己开发的一些功能,增加了可扩展性。对象适配器中还可以支持把多个适配者适配到同一个目标。

类适配模式对于一些不支持多重继承的语言来说最多只能适配一个适配者。适配者还不能为final类。

而对象适配模式情况下如果要修改适配者的方法会比较麻烦,可以先设计一个适配者的子类,然后再把这个子类当作真正的适配者,实现过程较复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值