设计模式-适配器模式(Adapter Pattern)

适配器模式

定义
将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。

类型
结构型。

分类
类适配器、对象适配器。

角色
目标接口:Target,该角色把其他类转换为我们期望的接口。
被适配者: Adaptee ,原有的接口,也是希望被适配的接口。
适配器: Adapter, 将被适配者和目标接口组合到一起的类。

适用场景

  • 想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
  • 我们有一个类,想将其设计为可重用的类,我们可以创建适配器,将这个类来适配其他没有提供合适接口的类。

优点

  • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构。
  • 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者类的复用性,同一个适配者类可以在多个不同的系统中复用。
  • 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,符合“开闭原则”。

缺点

  • 会让系统看起来很复杂,不易维护。

适配器模式最好在详细设计不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题。

类适配器
Adaptee类。

package com.kaven.design.pattern.structural.adapter.classadapter;

public class Adaptee {
    public void adapterRequest(){
        System.out.println("被适配者的方法");
    }
}

Target接口。

package com.kaven.design.pattern.structural.adapter.classadapter;

public interface Target {
    void request();
}

ConcreteTarget类,具体目标类,实现了Target接口。

package com.kaven.design.pattern.structural.adapter.classadapter;

public class ConcreteTarget implements Target {
    public void request() {
        System.out.println("concreteTarget目标方法");
    }
}

Adapter类,继承了Adaptee类,实现了Target接口。

package com.kaven.design.pattern.structural.adapter.classadapter;

public class Adapter extends Adaptee implements Target {
    public void request() {
        super.adapterRequest();
    }
}

Adapter类继承了Adaptee类,所以称为类适配器
应用层代码:

package com.kaven.design.pattern.structural.adapter.classadapter;

public class Test {
    public static void main(String[] args) {
        Target target = new ConcreteTarget();
        target.request();

        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}

输出:

concreteTarget目标方法
被适配者的方法

对象适配器

package com.kaven.design.pattern.structural.adapter.objectadapter;

public class Adaptee {
    public void adapterRequest(){
        System.out.println("被适配者的方法");
    }

}
package com.kaven.design.pattern.structural.adapter.objectadapter;

public interface Target {
    void request();
}
package com.kaven.design.pattern.structural.adapter.objectadapter;

public class ConcreteTarget implements Target {
    public void request() {
        System.out.println("concreteTarget目标方法");
    }
}

前面的这些类和类适配器中的一样。
Adapter类,实现了Target接口。

package com.kaven.design.pattern.structural.adapter.objectadapter;

public class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();

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

Adapter类没有继承Adaptee类,而是与Adaptee类实例进行组合,这便是对象适配器
应用层代码:

package com.kaven.design.pattern.structural.adapter.objectadapter;


public class Test {
    public static void main(String[] args) {
        Target target = new ConcreteTarget();
        target.request();

        Target adapterTarget = new Adapter();
        adapterTarget.request();
    }
}

输出:

concreteTarget目标方法
被适配者的方法

结果是一样,只是Adapter类与Adaptee类的关系不同而已。

例子
我们平时用充电器给手机充电,充电器可能需要将220v的电压转换成5v的电压,我们才能给手机正常充电。

AC220类(Adaptee),被适配者类,原有220v的电压。

package com.kaven.design.pattern.structural.adapter;

public class AC220 {
    public int outputAC220V(){
        int output = 220;
        System.out.println("输出交流电"+output+"V");
        return output;
    }
}

DC5类(Target接口),目标接口,需要转换成5v的电压。

package com.kaven.design.pattern.structural.adapter;

public interface DC5 {
    int outputDC5V();
}

PowerAdapter类(Adapter类),适配器类,将220v的电压转换成5v的电压。

package com.kaven.design.pattern.structural.adapter;

public class PowerAdapter implements DC5 {
    private AC220 ac220 = new AC220();

    public int outputDC5V() {
        int adapterInput = ac220.outputAC220V();

        //变压器...
        int adapterOutput = adapterInput/44;

        System.out.println("使用PowerAdapter输入AC"+adapterInput+"V"+"输出DC"+adapterOutput+"V");
        return adapterInput;
    }
}

应用层代码:

package com.kaven.design.pattern.structural.adapter;

public class Test {
    public static void main(String[] args) {
        DC5 dc5 = new PowerAdapter();
        dc5.outputDC5V();
    }
}

输出:

输出交流电220V
使用PowerAdapter输入AC220V输出DC5V

这里便完成了一个简单的适配器模式例子。

如果有说错的地方,请大家不吝赐教(记得留言哦~~~~)。

发布了258 篇原创文章 · 获赞 161 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/104090293