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

166 阅读2分钟

1.介绍

(1)适配器模式将某个类的接口转换为客户端期望的另一个接口,主要目的是兼容性,让两个不能一起工作的类可以协同工作,别名为包装器。

(2)属于结构性模式

(3)分为类适配器、对象适配器、接口适配器

2.工作原理

(1)适配器模式:将一个类的接口转换为另一个类的接口,让原本不兼容的类可以兼容

(2) 从用户的角度是看不到适配者的,是解耦的

(3)用户调用适配器转换出来的目标接口方法,适配器再调用被适配的相关接口方法

3.类适配器模式

java

public class VoltApdapter extends Vol220V implements Vol5V{
    public int output5V(){
      return output220V() / 44;
    }
}

缺点:类适配器需要继承src类(少用继承,多用组合)且src类中的方法在Adapter中会暴露出来,增加了使用成本。

优点:因为继承了src,所以可以根据需求重写src类中的方法,使Adapter的灵活性增强

4.对象适配器模式

基本思路和类适配器相似,但是不再继承src类,而是拥有src类的实例,即:持有src类,实现dist类接口

java

public class VoltApdapter implements Vol5V{
    private Vol220V vol220V;
   
    public VoltApdapter(Vol220V vol220V){
        this.vol220V = vol220V;
    }
    
     public int output5V(){
     int result = 0;
     if(vol220V != null){
         result = vol220V.output220v / 44;
     }
     return result
    }
}

优点:使用成本低,更灵活

5.接口适配器模式

当不需要全部实现接口提供的方法时,可以先设计一个抽象类的实现接口,为该接口中每个方法提供一个默认实现,那么该类的子类可以选择性覆盖父类中的方法来实现需求

java

// 对Interface4进行默认实现
public class AbsApapter implements Interface4{
   public void m1(){}
   public void m2(){}
}

public class Client{
  public void main(String [] args){
  
  @override
  public void m1(){
     sout('m1')
  }
  }
}

优点:使用成本低,更灵活

6.前端

image.png

js

class Adapte{
  test(){
   return '德国插头'
  }
}

class Target{
   constructor(){
     this.adaptee = new Adapte()
   }
   test1(){
     return `${this.adaptee.test()}中国插头`
   }
}

场景

(1)封装旧接口

(2)适配不同格式的数据

7.设计模式验证

(1)将旧接口和使用者进行分离

(2)符合开放封闭原则