【23种设计模式】让代码来告诉你什么叫适配器模式

适配器模式

  • 适配器模式是结构性模式之一
  • 结构型模式的作用就是:从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题
  • 首先应该明白:适配器模式是补救措施,所以在系统设计过程中请忘掉这个设计模式,这个模式只是在你无可奈何时的补救方式
  • 适配器模式从实现方式上分为两种,类适配器和对象适配器,这两种的区别在于实现方式上的不同,一种采用继承,一种采用组合的方式。
  • 另外从使用目的上来说,也可以分为两种,特殊适配器和缺省适配器,这两种的区别在于使用目的上的不同,一种为了复用原有的代码并适配当前的接口,一种为了提供缺省的实现,避免子类需要实现不该实现的方法。

生活中的例子

  • 例如现在轻薄笔记本会为了薄而去掉网线接口,转而提供一个TypeC的接口,那么如果要插网线该怎么办呢,就会用到一个叫拓展坞的小工具,来拓展我们的接口适配
  • 用转换器,一端连接网线,一端连接笔记本,那么对应到代码中,就是三个类,一个网线,一个笔记本,一个转换器

代码实现

【23种设计模式】让代码来告诉你什么叫适配器模式_第1张图片

  1. 先写三个类,网线类,笔记本类,转换器类
// 要被适配的网线接口
public class Adaptee {
    public void request(){
        System.out.println("连接网线上网");

    }
}
========================================================================
// 笔记本类 想上网,但是差不了网线
public class Computer {
    // 电脑需要接上这个转换器才能上网
    public void net(NetToUSB adapter){
        // 想上网,要连接网线,于是去找一个转接头
        adapter.handler();
    }
}
========================================================================
// 网线转换器接口
public interface NetToUSB {
    // 处理要上网的请求
    public void handler();
}
========================================================================
// 实现类,真正的网线转换器,需要连接网线,还要连接电脑
// 继承了网线,实现上网这个功能
public class Adapter extends Adaptee implements NetToUSB{
    // 处理笔记本要上网的请求
    @Override
    public void handler() {
        super.request(); // 这样就可以上网了
    }
}
  1. 测试方法
public static void main(String[] args) {
    // 继承的方式
    Computer computer = new Computer(); //电脑
    NetToUSB adapter = new Adapter(); //转接器
    computer.net(adapter);
}
  1. 这里实现的方式是通过继承,这样的适配器称为类适配器,因为Java的单继承的特性,所以比较受限,另外还有一个方式称为对象适配器,会比较常用,是通过组合的方式。
// 通过组合的方式实现适配器
public class Adapter2 implements NetToUSB{

    // 私有化网线
    private final Adaptee adaptee;
    // 构造方法传入
    public Adapter2(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void handler() {
        adaptee.request();
    }
}
  1. 测试方法
public static void main(String[] args) {
	Computer computer = new Computer(); //电脑
	// 组合的方式
	Adaptee adaptee = new Adaptee();
	NetToUSB adapter2 = new Adapter2(adaptee);
	computer.net(adapter2);
}

小结

  • 适配器模式是的原本由于接口不兼容而不能一起工作的那些类可以在一起工作
  • 适配器可以通过包装一个需要适配的对象,把原接口转换成目标对象
  • 对象适配器的优点
    • 一个对象适配器可以把多个不同的适配者适配到同一个目标
    • 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据里氏替换原则,适配者的子类也可以通过该适配器进行适配
  • 类适配器的缺点
    • 对于Java、C#、等不支持多重类继承的语言,一次只能适配一个适配者类,不能同时适配多个适配者
    • 在Java、C#、等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性
  • 使用场景
    • 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码
    • 想创建一个可以重复使用的类,用于与一些彼此之间没有太多关联的一些类,包括一些可能在将来引进的类一起工作

你可能感兴趣的:(23种设计模式)