适配器模式(Adapter)----设计模式

适配器模式(Adapter)----设计模式

What is it(它是什么)?

适配器模式(Adapter Pattern)是作为两个不兼容之间接口之间的桥梁。

在这里插入图片描述

适配器模式来源于生活,例如,读卡器是作为内存卡和笔记本之间的适配器,电流转换插座是解决所需电压和实际电压不匹配的适配器等等。

适配器模式的简单介绍

在这里插入图片描述

简单来说,适配器模式主要解决的是两个不兼容接口连接的问题。

适配器模式的工作原理

在这里插入图片描述

简单来说,就是将不兼容的类通过适配器转化为可以兼容的类进行协同工作

适配器模式实现的三种方式

  1. 类适配器: 通过继承的方式使适配器类继承被适配类,从而可以使用并改变被适配类的运行操作,实现工作兼容
  1. 对象适配器: 通过将被适配类聚合到适配器类中,根据构造方法传入被适配类实例,适配器类根据此实例进行操作,从而实现接口兼容,推荐使用。
  1. 接口适配器: 通过定义一个抽象类继承接口覆写接口中的所有方法,这样,继承此抽象类的子类就可以有选择的使用接口中的方法

嘻嘻,是不是有些难以理解,没关系,下面我来演示一下相信大家就能够清楚。

适配器小案例

现在小高有一个手机(Phone),但是很不巧没有电了需要充电,但是插座却是220V的电压,手机所需充电电压为5V,此时需要设计一个将220V电压转化为5V电压的转化插座,你能帮小高设计好么?

以类适配器进行设计

此适配器通过继承的方式对被适配类进行操作改进,从而实现了电压的兼容。

插座220V类

package com.design_patterns.adapter.classadapter;

public class Voltage220V {
    
    
    //输出220伏电压
    public int output220V(){
    
    
        int src = 220;
        System.out.println("电压 = " + src + "伏");
        return src;
    }
}

输出电压为5V的接口

package com.design_patterns.adapter.classadapter;

public interface IVoltage5V {
    
    
    public int output5V();
}

进行电压转换的类适配器

package com.design_patterns.adapter.classadapter;

//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V{
    
    

    //覆写接口中的方法
    @Override
    public int output5V() {
    
    
        //获取到220V的电压
        int srcV = output220V();
        int dstV = srcV / 44;       //转成5V
        return dstV;
    }
}

手机类

package com.design_patterns.adapter.classadapter;

public class Phone {
    
    

    //充电
    public void charging(IVoltage5V iVoltage5V){
    
    
        if(iVoltage5V.output5V() == 5){
    
    
            System.out.println("电压为5V,可以充电~~~");
        } else if (iVoltage5V.output5V() > 5){
    
    
            System.out.println("电压大于5V,不可以充电~~~");
        }
    }
}

客户端使用并充电

package com.design_patterns.adapter.classadapter;

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

运行结果

====类适配器模式====
电压 = 220伏
电压为5V,可以充电~~~

以对象适配器进行设计

此适配器通过聚合的方式对被适配类进行操作改进,从而实现了电压的兼容,下面仅列出与上面适配器的不同之处

进行电压转换的对象适配器

package com.design_patterns.adapter.objectadapter;

//适配器类
public class VoltageAdapter implements IVoltage5V {
    
    
    private Voltage220V voltage220V;        //关联关系-聚合

    //通过构造方法得到Voltage220V的对象实例
    public VoltageAdapter(Voltage220V voltage220V) {
    
    
        this.voltage220V = voltage220V;
    }

    /**
     * 将220V的电压转换为5V的电压的方法
     * 返回转换过后的电压
     * @return
     */
    @Override
    public int output5V() {
    
    
        //获取到220V的电压
        int srcV = this.voltage220V.output220V();
        int dstV = srcV / 44;
        System.out.println("使用对象适配器适配完成!!!");
        return dstV;
    }
}

客户端使用并充电

package com.design_patterns.adapter.objectadapter;

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

运行结果

====对象适配器模式====
电压 = 220伏
使用对象适配器适配完成!!!
电压为5V,可以充电~~~

接口适配器、缺省适配器模式(自定义小案例)

定义的接口

package com.design_patterns.adapter.interfaceadapter;

public interface Interface4 {
    
    
    public void m1();
    public void m2();
    public void m3();
    public void m4();
}

定义的抽象类

package com.design_patterns.adapter.interfaceadapter;

public abstract class AbsAdapter implements Interface4 {
    
    
    @Override
    public void m1() {
    
    

    }

    @Override
    public void m2() {
    
    

    }

    @Override
    public void m3() {
    
    

    }

    @Override
    public void m4() {
    
    

    }
}

定义的测试类进行测试

package com.design_patterns.adapter.interfaceadapter;

public class Client {
    
    
    public static void main(String[] args) {
    
    
        AbsAdapter absAdapter = new AbsAdapter() {
    
    
            /**
             * 此时只需要去覆盖我们需要使用的接口方法
             */
            @Override
            public void m1() {
    
    
                System.out.println("调用的是子类m1的方法");
            }
        };
        absAdapter.m1();
    }
}

运行结果

调用的是子类m1的方法

嘻嘻,这个案例虽然特别简单,但是在实际开发中还是非常有用的,通过设计一个抽象类适配器用来只实现需要实现的方法。

总结

至此,适配器的基本内容就梳理完了,嘻嘻,可能这次梳理的不是特别生动和有趣,小伙伴们理解就好,谢谢~

猜你喜欢

转载自blog.csdn.net/weixin_43479947/article/details/107539701