首页 > 其他分享 >23种设计模式——适配器模式

23种设计模式——适配器模式

时间:2023-12-09 14:31:37浏览次数:26  
标签:23 适配 适配器 5V 接口 电压 设计模式 public

今天开始我们就要进入到结构型的设计模式学习之中了,今天讲的设计模式是23种设计模式的第六种——适配器模式。通俗的讲,适配器的作用就是将两个互不兼容的东西进行一个适配的操作,它作为中间的桥梁。 下面我们进入适配器模式的学习。

应用前景:

在现实生活中,适配器这样的例子随处可见。就比如用直流电的笔记本电脑接交流电源时需要一个电源适配器,中国人和外国人交流,中间需要一个翻译等等。

在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式就能很好地解决这些问题。

适配器模式的概念:

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

其别名为包装器。

特点:

适配器模式的主要优点:

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。

其缺点是:

  • 对类适配器来说,更换适配器的实现过程比较复杂。
适配器模式工作原理:
  • 适配器模式:将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。
  • 从用户的角度看不到被适配者,它与目标类是解耦的。
  • 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。
  • 用户收到反馈结果,感觉只是和目标接口交互。

1.类适配器模式

思路分析:

image.png

代码:

适配接口:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:适配接口,输出5V的电压
 */
public interface Voltage5V {
    //定义一个输出5V电压的方法
    int output5V();
}

被适配的类:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:被适配的类,正常输出220V电压,需要被适配成5V电压
 */
public abstract class Voltage220V {
    //输出220V的电压
    public int output220V() {
        int voltage = 220;
        System.out.println("当前电压:" + voltage + "V");
        return voltage;
    }
}

充电类:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:充电
 */
public class Phone {
    //定义一个给手机充电的方法
    public void charging(Voltage5V v) {
        if (v.output5V() == 5) {
            System.out.println("电压5V,允许充电");
        }else if (v.output5V() > 5){
            System.out.println("电压过高,无法充电");
        }else {
            System.out.println("电压异常,禁止充电");
        }

    }
}

适配器类:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:适配器类,这里要将220V电压适配成5V的电压
 */
public class VoltageAdapter extends Voltage220V implements Voltage5V {
    //220V电压适配成5V电压
    @Override
    public int output5V() {
        int targetVoltage = 0;
        //1.获取到需被适配的220V电压
        int v = output220V();
        //2.返回已适配的5V电压
        targetVoltage = v/44;
        System.out.println("适配完成,当前电压:" + targetVoltage + "V");

        return targetVoltage;
    }
}

类适配器模式测试:

package cn.ppdxzz.adapter.classadapter;

/**
 * Description:类适配器模式
 */
public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        //传入5V电压
        phone.charging(new VoltageAdapter());
    }
}

输出结果:

当前电压:220V
适配完成,当前电压:5V
电压5V,允许充电

2.对象适配器模式

思路分析:

image.png

代码:

适配接口:

package cn.ppdxzz.adapter.objectadapter;
/**
 * Description:适配接口,输出5V的电压
 */
public interface Voltage5V {
    //定义一个输出5V电压的方法
    int output5V();
}

被适配的类:

package cn.ppdxzz.adapter.objectadapter;
/**
 * Description:被适配的类
 */
public class Voltage220V {
    //输出220V的电压
    public int output220V() {
        int voltage = 220;
        System.out.println("当前电压:" + voltage + "V");
        return voltage;
    }
}

充电类:

package cn.ppdxzz.adapter.objectadapter;
/**
 * Description:充电
 */
public class Phone {
    //定义一个给手机充电的方法
    public void charging(Voltage5V v) {
        if (v.output5V() == 5) {
            System.out.println("电压5V,允许充电");
        } else if (v.output5V() > 5) {
            System.out.println("电压过高,无法充电");
        }else {
            System.out.println("电压异常,禁止充电");
        }

    }
}

适配器类:

package cn.ppdxzz.adapter.objectadapter;

/**
 * Description:适配器类,这里要将220V电压适配成5V的电压
 */
public class VoltageAdapter implements Voltage5V {
    private Voltage220V voltage220V;//聚合注入
    public VoltageAdapter() {
    }
    //通过构造器传入220V电压
    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        int targetVoltage = 0;
        if (voltage220V != null) {
            //1.获取到需被适配的220V电压
            int output220V = voltage220V.output220V();//得到需被适配的220V电压
            //2.返回已适配的5V电压
            targetVoltage = output220V/44;
            System.out.println("适配完成,当前电压:" + targetVoltage + "V");
        }
        return targetVoltage;
    }
}

对象适配器模式测试:

package cn.ppdxzz.adapter.objectadapter;

/**
 * Description:对象适配器模式
 */
public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charging(new VoltageAdapter(new Voltage220V()));
    }

}

输出结果:

当前电压:220V
适配完成,当前电压:5V
电压5V,允许充电

3.接口适配器模式

思路分析:

image.png

代码:

适配接口:

package cn.ppdxzz.adapter.interfaceadapter;

/**
 * Description:适配接口
 */
public interface InterfaceTest {
    //定义三个测试方法
    void test1();
    void test2();
    void test3();

}

适配器抽象类:

package cn.ppdxzz.adapter.interfaceadapter;
/**
 * Description:AbstractAdapter抽象类,默认实现接口的所有方法
 */
public abstract class AbstractAdapter implements InterfaceTest {
    @Override
    public void test1() {

    }
    @Override
    public void test2() {

    }
    @Override
    public void test3() {

    }
}

接口适配器模式测试:

package cn.ppdxzz.adapter.interfaceadapter;
/**
 * Description:接口适配器模式
 */
public class Client {
    public static void main(String[] args) {
        //匿名内部类
        AbstractAdapter adapter = new AbstractAdapter() {
            @Override
            public void test1() {
                super.test1();
                System.out.println("测试test1方法");
            }
        };
        adapter.test1();
    }
}

输出结果:

测试test1方法
适配器模式源码分析:

SpringMVC中的HandlerAdapter就使用到了适配器模式。

image.png

总结:

适配器模式最大的作用还是将原本不兼容的接口融合在一起工作。

适配器模式到这里就讲解完毕了,后续会继续更新剩下的设计模式,敬请期待。

标签:23,适配,适配器,5V,接口,电压,设计模式,public
From: https://blog.51cto.com/u_16167640/8749107

相关文章

  • 2023-2024-1 20231424《计算机基础与程序设计》第11周学习总结
    2023-2024-120231424《计算机基础与程序设计》第11周学习总结作业信息作业属于的课程<班级链接>(2022-2023-1-计算机基础与程序设计)作业要求<作业要求>(2022-2023-1计算机基础与程序设计第一周作业)作业目标《计算机科学概论》第15,16章和《C语言程序设计》第10章......
  • 2023振兴杯-Crypto wp
    crypto1题目fromflagimportflagdefencrypt(x,y):key='zxb'result=''foriinrange(len(x)):result+=chr(ord(x[i])^ord(y[i])^ord(key[i%3]))returnresultx=flagy=flag[1:]+flag[......
  • 2023-2024-1 20232327《网络空间安全导论》第五周学习总结
    2023-2024-120232327《网络空间安全导论》第五周学习总结教材学习内容总结1.信息内容安全是研究利用计算机从包含海量信息并且迅速变化的网络中对特定安全主题相关信息进行自动获取、识别和分析的技术;2.网络爬虫是按照一定规则,自动抓取有互联网信息的程序或脚本;3.信息过滤是......
  • 2023.12
    启动。DEGwer'sDoctoralDissertationCheeringContest好魔怔的比赛。E.HalfPalindromes先考虑单个\(f(l,r)\)的计算,有结论:我们一定会不断删最小的长度为\(k\)的前缀,满足前\(2k+1\)个字符是回文的。直到没有这样的\(k\)为止。证明也很容易,假设我们某一步删了长度......
  • 2023最新中级难度Go语言面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-中级难度Go语言面试题合集问:请描述一下Go语言的并发模型,并解释一下为什么它适合现代Web应用?Go语言的并发模型是基于CSP(CommunicatingSequentialProcesses,通信顺序进程)理论,主要是通过goroutine和channel来实现并发的。goroutine可以看......
  • 2023最新高级难度Go语言面试题,包含答案。刷题必备!记录一下。
    好记性不如烂笔头内容来自面试宝典-高级难度Go语言面试题合集问:请深入解释Go语言的内存分配和GC(垃圾回收)机制,以及它们如何影响程序的性能。Go语言的内存管理由内置的垃圾回收器自动进行,它将内存分为三个区域:堆、栈和全局区。栈存放局部变量、参数、返回地址等小对象,堆存......
  • Day23 循环结构-while循环
    循环结构-while循环循环结构分为while循环do.....while循环for循环在Java5中引入了一种主要用于数组的增强型for循环while循环while循环是最基本的循环,它的结构为:while(布尔表达式){//循环内容}只要布尔表达式为true,循环就会一直执行下去。我们大多数......
  • 2023年下半年网络工程师
    上午:56下午:46有点意外,因为对下午的案例确实没底,从2022年下半年开始,感觉难度提升了不少。上午的题刷刷历年真题基本OK了,下午的题多看看华为的配置命令,考试前一个月,在公司休息的时候,就打开华为的交换机/路由器的配置命令来看,下午案例题经常考不在书本上的一些配置命令。疫情期......
  • 20231209
    我还活着。早上一起来就绷不住了。我昨天收拾塑形镜的用具的时候忘了把护理液拿回来。昨晚我给家长说了,然后家长说没有就不用了呗。然后今天早上我就没用。我妈拿着一个没开封的护理液(外面的盒子都没拆)问我我用了吗。(这算是明知故问吗?)我疑惑了,我说我没用,我不知道啊。我妈......
  • Nexpose v6.6.230 for Linux & Windows - 漏洞扫描
    Nexposev6.6.230forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,ReleaseDec07,2023请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序搜集通过实时覆盖整个网络,随......