适配器模式详解

来源:互联网 发布:数据泄漏 编辑:程序博客网 时间:2024/05/17 02:14

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

模式的角色:
- 目标接口(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();    }}