TypechoJoeTheme

IT技术分享

统计

适配器模式——23种设计模式之结构型模式

2015-06-30
/
0 评论
/
704 阅读
/
正在检测是否收录...
06/30

在软件系统中,由于应用环境的变化,常常需 要将“一些现存的对象”放在新的环境中应用, 但是新环境要求的接口不满足这些现存对象的 要求。如何应对这种“迁移的变化”?如何既能利用现有对 象的良好实现,又能同时满足新的应用环境所要求的 接口?

适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:对象适配器模式、类适配器模式、接口适配器模式。

一、类图表示

涉及到“目标”(Target)、“具体用户(Client)”,“适配者(Adaptee)” 以及“ 被适配者(Adapter)” 等四个角色。

  • ①、Target:定义Client使用的与特定领域相关的接口
  • ②、Client:与符合Target接口的对象协同
  • ③、Adaptee:定义一个已经存在的接口,这个接口需要适配
  • ④、Adapter:对Adaptee的接口与Target的接口进行适配

1、类适配器

java-adapter-model-2

2、对象适配器

java-adapter-model-1

二、代码示例

1、类适配器

// 目标接口,或称为标准接口
interface Target {
    public void request();
}
// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
class Adaptee {
    public void specificRequest() {
        System.out.println("被适配类具有 特殊功能...");
    }
}
// 具体目标类,只提供普通功能
class ConcreteTarget implements Target {
    public void request() {
        System.out.println("普通类 具有 普通功能...");
    }
}
// 适配器类,继承了被适配类,同时实现标准接口
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();
    }
}

2、对象适配器

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

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

    public void request() {
    // 这里是使用委托的方式完成特殊功能
        this.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();
    }
}

三、优缺点分析

1、优点

  • ①、通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
  • ②、复用了现存的类,解决了现存类和复用环境要求不一致的问题。
  • ③、将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
  • ④、同一个适配器可以把适配者类和它的子类都适配到目标接口。

2、缺点

  • ①、对于对象适配器来说,更换适配器的实现过程比较复杂。

四、与其他模式比较

1、与Bridge比较

  • ①、结构类似
  • ②、Bridge的目的是将接口部分和实现部分分离,从而使得它们可以较为容易也相对独立的加以改变。
  • ③、adapter则意味着改变一个已有对象的接口

2、与Decorator比较

  • ①、Decorator增强了其它对象的功能而同时又不改变它的接口
  • ②、Decorator透明性比adapter好

3、与Proxy比较

  • ①、Proxy在不改变它的接口的条件下,为另一个对象定义了一个代理。

五、适用场景

两个类所做的事情相同或相似,但是具有不同接口的时候。

  • ①、系统需要使用现有的类,而这些类的接口不符合系统的接口。
  • ②、想建立一个可以重用的类,用于与一些彼此没太大关联的类,包括一些可能在将来引进的类一起工作。
  • ③、旧系统开发的类已经实现了一些功能,但客户端却只能以另外接口的形式访问。
  • ④、补偿模式,解决接口不相容问题,通过把非本系统接口的对象包装成本系统可接受的对象
  • ⑤、用于解决正在服役的项目问题,在详细设计阶段一般不予考虑
朗读
赞 · 0
版权属于:

IT技术分享

本文链接:

https://idunso.com/archives/2746/(转载时请注明本文出处及文章链接)