适配器模式详解

定义: 将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。

模式的角色:
- 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- 需要适配的类(Adaptee):需要适配的类或适配者类。
- 适配器(Adapter):通过包装一个需要适配的对象,把元接口转换成目标接口。

实现方式

1. 类的适配器模式(采用继承实现)
- UML
类适配器
- 使用对象集成的方式,是静态的定义方式;
- 由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理Adaptee的子类了。
- 适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。
- 仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee。

2. 对象适配器模式(采用对象组合方式实)
- UML
对象适配器
- 使用对象组合的方式,是动态组合的方式。
- 一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。
- 要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。虽然重定义Adaptee的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源。
- 需要额外的引用来间接得到Adaptee。

代码: 这里给出的是对象适配器的java代码

Cient 类最终面对的是 Target 接口(或抽象类),它只能够使用符合这一目标标准的子类;而 Adaptee 类则是被适配的对象(也称 源角色),因为它包含specific (特殊的)操作、功能等,所以我们想要在自己的系统中使用它,将其转换成符合我们标准的类,使得 Client 类可以在透明的情况下任意选择使用 ConcreteTarget 类或是具有特殊功能的 Adatee 类。

// 目标接口,或称为标准接口
public interface Target {
    public void request();
}

// 具体目标类,只提供普通功能
public class ConcreteTarget implements Target {
    @Override
    public void request() {
        System.out.println("普通类具有普通功能");
    }
}

// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
public class Adaptee {
    public void specificRequest(){
        System.out.println("被适配类具有特殊功能");
    }
}

// 适配器类,直接关联被适配类,同时实现标准接口
public class Adapter implements Target {
    // 直接关联被适配类
    private Adaptee adaptee;

    // 可以通过构造函数传入具体需要适配的被适配类对象
    public Adapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        // 这里是使用委托的方式完成特殊功能
        adaptee.specificRequest();
    }
}

public class Client {
    public static void main(String[] args) {

        // 使用普通功能类
        Target concreteTarget = new ConcreteTarget();
        concreteTarget.request();

        // 使用特殊功能类,即适配类,
        // 需要先创建一个被适配类的对象作为参数
        Target adapter = new Adapter(new Adaptee());
        adapter.request();
    }
}
类适配器

类适配器用的多继承的方式,Adapter继承Adaptee,也实现了 Target 接口(因为 Java 不支持多继承,所以这样来实现)

// 适配器类,继承了被适配类,同时实现标准接口
class Adapter extends Adaptee implements Target{
    public void request() {
        super.specificRequest();
    }
}

public class Client {
    public static void main(String[] args) {
        // 使用普通功能类
        Target concreteTarget = new ConcreteTarget();
        concreteTarget.request();

        // 使用特殊功能类,即适配类
        Target adapter = new Adapter();
        adapter.request();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值