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

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

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

  • Adapter模式有两种实现:

  1. 使用继承的适配器。

类图

代码

//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. 使用委托的适配器。

类图

代码

//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模式对这个类进行适配,借用这个类的已有方法开发新功能,减轻测试负担。
    还有更多的应用场景,比如提高与旧版本的兼容性。但我现在还不能完全理解。

posted on 2019-06-09 10:03  vplus  阅读(128)  评论(0编辑  收藏  举报