Adapter即适配器,可以类比为将220V的电压的电源转为5V电压的手机充电器,起转换的作用。

  • 明确概念:
    Adaptee:被适配者,即220v电压的电源
    Adapter:适配器,即手机充电器
    Target:适配目标,即输出5V电压
    Client:请求适配者,即手机

  • Adapter模式有两种实现:

  1. 使用继承的适配器。

类图

《图解设计模式》读书笔记1-2 Adapter模式

代码

//Adaptee
public class Banner {
    private String string;
    public Banner(String string) {
        this.string = string;
    }
    public void showWithParen() {
        System.out.println("("+string+")");
    }
    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

//Target
public interface Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

//Adapter
public class PrintBanner extends Banner implements Print {
    public PrintBanner(String string) {
        super(string);
    }
    @Override
    public void printWeak() {
        showWithParen();
    }
    @Override
    public void printStrong() {
        showWithAster();
    }
}

//Client
public static void main(String[] args) {
        Print p = new PrintBanner("Hello");
        p.printWeak();
        p.printStrong();
}
  1. 使用委托的适配器。

类图

《图解设计模式》读书笔记1-2 Adapter模式

代码

//Adaptee
public class Banner {
    private String string;
    public Banner(String string) {
        this.string = string;
    }
    public void showWithParen() {
        System.out.println("("+string+")");
    }
    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

//Target
public abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

//Adapter
public class PrintBanner extends Print {
    private Banner banner;
    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }
    public void printWeak() {
        banner.showWithParen();
    }
    public void printStrong() {
        banner.showWithAster();
    }
}

//Client
public static void main(String[] args) {
        Print p = new PrintBanner("Hello");
        p.printWeak();
        p.printStrong();
}
  • 两种实现方式的区别
    Adapter根据不同的Target类型分别进行实现。如果Target是接口,那Adapter就继承Adaptee,使用Adaptee的方法实现Target的方法。如果Target是抽象类,那Adapter就在自己内部创建Adaptee对象,继承Target类,调用Adaptee对象的方法实现Target类的方法。

  • 为什么使用这种模式
    很多时候,我们不是从零开始编程的,要尽量复用现有的经过充分测试的类。此时使用Adapter模式对这个类进行适配,借用这个类的已有方法开发新功能,减轻测试负担。
    还有更多的应用场景,比如提高与旧版本的兼容性。但我现在还不能完全理解。

相关文章:

  • 2021-06-13
  • 2022-01-12
  • 2021-11-26
  • 2019-08-28
  • 2021-12-28
  • 2021-11-18
  • 2021-12-12
  • 2021-11-18
猜你喜欢
  • 2022-01-08
  • 2019-07-15
  • 2021-11-23
  • 2021-07-30
  • 2020-07-15
  • 2021-11-06
  • 2018-09-02
  • 2021-08-29
相关资源
相似解决方案