java & 设计模式 & 适配器模式

113 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第31天,点击查看活动详情

适配器模式

适配器模式(Adapter Pattern)将某个类的接口转换成调用方期望的形式或者说格式,主要目的是用来做兼容,让原本接口不匹配不能一起工作的两个类可以协同工作。适配器模式属于结构型模式,主要分为三类: 类适配器模式,对象适配器模式,接口适配器模式。

下面我们先来看看 类适配器

java 是但继承机制,所以类适配器需要继承src类 这一点算是一个缺点,因为要求dst必须是接口,有局限性。src类的方法在Adapter中会暴露出来,也增加使用成本,因为继承了src类,可以重写sec的类中方法使得Adapter的灵活性增强了。

下面我们看一个 手机充电 电压兼容的一个例子

类图:

image.png 先准备一个src 用来给类适配器继承

public class Voltage220V {

 public int  outPut220V(){
     int src =220;
     System.out.println("电压 = " + src+"伏");
     return src;
 }

}

第二步准备一个dst接口

public interface Voltage5V {
    public int outPut5V();
}

第三步准备一个适配类

public class VoltageAdapter extends Voltage220V implements Voltage5V {

    @Override
    public int outPut5V() {
        int srcv=outPut220V();
        int dest=srcv/44;
        System.out.println("将电压兼容到 5V");
        return dest;
    }
}

第四步准备一个 手机类并添加一个充电的方法

public class Phone {

   public void charging(Voltage5V v){
       int outPut5V = v.outPut5V();
       if(outPut5V==5){
           System.out.println("电压为5V,正常充电~~~~~");
       }else if(outPut5V>5){
           System.out.println("电压过高,不能正常充电~~~~~");
       }
   }
}

第五步 调用

public class Cilent {


    public static void main(String[] args) {
        System.out.println("类适配器模式");
        Phone phone=new Phone();
        phone.charging(new VoltageAdapter());
    }
}

输出结果:

类适配器模式
电压 = 220伏
将电压兼容到 5V
电压为5V,正常充电~~~~~

对象适配器

将Adapter类作修改,不是继承src类而是持有src类的实例,已解决兼容性问题(聚合)。即就是持有src类 实现dst类接口完成 src到dst的适配。根据合成复用原则,在系统中尽量使用关联关系来代继承关系。对象适配器模式是适配器模式常用的一种。

image.png 对象适配器模式只需要修改适配类 将 src类持有(也可以理解为注入通过set方法 或者 构造器)

public class VoltageAdapter implements Voltage5V {
    private Voltage220V voltage220V;
    //同过set方法给voltage220V 赋值  当然你也可以用构造器
    public void setVoltage220V(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }
    @Override
    public int outPut5V() {
        int srcv=voltage220V.outPut220V();
        System.out.println("将电压兼容到 5V");
        int dest=srcv/44;
        return dest;
    }
}

调用方:

public class Cilent {


    public static void main(String[] args) {
        System.out.println("对象配器模式");
        Phone phone=new Phone();
        VoltageAdapter voltageAdapter = new VoltageAdapter();
        voltageAdapter.setVoltage220V(new Voltage220V());
        phone.charging(voltageAdapter);
    }
}

输出结果:

对象配器模式
电压 = 220伏
将电压兼容到 5V
电压为5V,正常充电~~~~~

接口适配器模式

默认适配器模式,当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中的每一个方法提供一个默认实现,这样子类就可以选择性覆盖父类的方法进行重写实现需求分析。在jdk1.8 中 有接口的增强提供默认方法 其实现类可以选择性实现。

准备接口

public interface Mytest {
    
    public int test001();
    public int test002();
    public int test003(); 
}

准备适配类

public abstract class TestAdapter implements Mytest{
    @Override
    public int test001() {
        return 0;
    }
    @Override
    public int test002() {
        return 0;
    }
    @Override
    public int test003() {
        return 0;
    }
}

应用调用

public class Cilent {
    public static void main(String[] args) {
       new TestAdapter(){
           @Override
           public int test001() {
               //具体实现
               return 0;
           }
       };
    }
}

只需要实现业务场景中需要处理的方法去重写业务逻辑。这里有点像 jdk1.8的接口增强(是我自己的理解)

实践是检验真理的唯一方法! 明天见🥰🥰🥰