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

余生长醉 提交于 2020-02-10 04:52:48

目录

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!