图解设计模式(二)适配器模式

 读书笔记 仅供参考

Adapter 模式

Adapter 即为是适配器,用来填补两者之间的差异。就想充电器的装换器,要把 220v 的电压转换为低电压才能对手机或电脑充电。 
Adapter 模式也称为 Wrapper(包装器)模式。 
两种 Adapter 模式: 

  • 类适配器模式(使用继承的适配器)
  • 对象适配器模式(使用委托的适配器)

在这里插入图片描述

 在这里插入图片描述

角色

Client 类是客户端,调用适配器。 
Adaptee 是需要包装的类,等于是 220V 电压的接头。 
Target 接口是供客户端调用的接口,它定义了适配器需要实现的方法,等于是手机充电转化器的 USB 插口。 
Adapter 类是适配器类,它继承了 Adaptee 类和实现类 Target 接口,等于转换器的内部构造,清楚如何将电压从 220V 转为 5V。

 

类适配模式

例子

Banner 类,作为 Adaptee,实现了最初的方法。

UML

public class Banner {
    private String string;

    public Banner(String string) {
        this.string = string;
    }
    public void showWithPattern() {
        System.out.println("(" + string + ")");
    }

    public void showWithStar() {
        System.out.println("*" + string + "*");
    }
}

Print 接口,定义了客户端调用的方法,作为 Target

public interface Print {
    void printWeek();
    void printStrong();
}

PrintBanner 类,继承了 Banner 和实现了 Target,作为 Adpter

public class PrintBanner extends Banner implements Print{

    public PrintBanner(String string) {
        super(string);
    }

    @Override
    public void printWeek() {
        showWithPattern();
    }

    @Override
    public void printStrong() {
        showWithStar();
    }
}

Main 类,测试效果

public class Main {

    public static void main(String[] args) {
        Print print = new PrintBanner("Hello");
        print.printWeek();
        print.printStrong();
    }
}

在这个例子中,Main 调用 PrintBanner 的方法,实际上起作用的是 Banner 类中的方法,Main 并不知道其中的实现是怎样的。

 

 

对象适配器模式

对象适配器模式即是使用委托的模式,使用组合来替代继承。

UML


 这张图和上面一张图的区别是 Adapter 并不是继承 Adaptee 和 实现 Target 了。 
Adaptee 的实例作为 Adapter 的一个属性。Target 并不是一个接口,而是一个抽象类,同样定义了供 Client 调用的方法,Adapter 继承了 Target 类。

程序例子

Main 和 Banner 的程序和上面一样。

Print 类,为抽象类。

public abstract class Print {
    public abstract void printWeek();
    public abstract void printStrong();
}

PrintBanner 类,拥有一个 Banner 实例,继承了 Print 类。在实现哦方法中调用了 Banner 的方法。

public class PrintBanner extends Print{

    private Banner banner;

    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }

    @Override
    public void printWeek() {
        banner.showWithPattern();
    }

    @Override
    public void printStrong() {
        banner.showWithStar();
    }
}

 

何时使用 Adapter 模式

复用已有组件

我们更倾向于不修改已有程序的代码,并且能够更多的复用已存在的“组件”。Adapter 模式会对现有类进行适配,生成新的类,当出现 BUG 时,我们也能确定出现问题的是 Adapter 类,而不是 Adaptee 类。

没有现成的代码

有时候我们会想到把现有程序改一改就可以成功运行了,但有时候我们只能使用一些特定的接口,无法知道源代码,这样 Adapter 模式就可以发挥作用了。

版本升级与兼容性

使用 Adapter 模式可以很好地解决软件版本升级后出现的兼容性问题。

相关设计模式

Bridge 模式

Adapter 模式用于连接接口不同的类,Bridge 模式用于连接类的功能层次结构和实现层次结构

Decorator 模式

Decorator 模式是在不改变接口的前提下添加功能。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值