• 适配器模式和装饰器模式


    适配器模式

    1.引出适配器模式

    1.多功能转换插头

    image-20240529203251649

    2.基本介绍

    image-20240529203509980

    3.工作原理

    image-20240529203741032

    2.类适配器

    1.基本介绍

    image-20240529203956891

    2.类图

    image-20240529205154428

    3.代码实现
    1.Voltage220V.java
    package com.sun.classadapter;
    
    /**
     * Description: 被适配者
     * @Author sun
     * @Create 2024/5/29 20:53
     * @Version 1.0
     */
    public class Voltage220V {
        public int output220V() {
            int src = 220;
            System.out.println("电压输出为" + src + "伏");
            return src;
        }
    }
    
    2.Voltage5V.java
    package com.sun.classadapter;
    
    /**
     * Description: 适配器的接口
     * @Author sun
     * @Create 2024/5/29 20:56
     * @Version 1.0
     */
    public interface Voltage5V {
    
        // 用于将5V的电压适配到220V
        public int output5V();
    }
    
    3.VoltageAdapter.java
    package com.sun.classadapter;
    
    /**
     * Description: 适配器
     * @Author sun
     * @Create 2024/5/29 20:58
     * @Version 1.0
     */
    public class VoltageAdapter extends Voltage220V implements Voltage5V{
        @Override
        public int output5V() {
            // 将220V的电压适配到5V
            int srcV = super.output220V();
            int disV = srcV / 44;
            return disV;
        }
    }
    
    4.Phone.java
    package com.sun.classadapter;
    
    /**
     * Description: 使用者
     * @Author sun
     * @Create 2024/5/29 21:00
     * @Version 1.0
     */
    public class Phone {
        // 依赖一个适配器进行充电
        public void charging(Voltage5V voltage5V) {
            if (voltage5V.output5V() == 5) {
                System.out.println("电压为5V,适配成功,可以开始充电");
            } else {
                System.out.println("电压不为5V,无法充电!");
            }
        }
    }
    
    5.Client.java
    package com.sun.classadapter;
    
    /**
     * Description:
     * @Author sun
     * @Create 2024/5/29 21:03
     * @Version 1.0
     */
    public class Client {
        public static void main(String[] args) {
            Phone phone = new Phone();
            // 给手机装配一个5V的适配器进行充电
            phone.charging(new VoltageAdapter());
        }
    }
    
    6.结果

    image-20240529211353436

    4.类适配器的注意事项

    image-20240529211706653

    3.对象适配器

    1.基本介绍

    image-20240529211827759

    2.使用对象适配器改进类适配器
    1.类图

    image-20240529212625622

    2.介绍

    image-20240529212038831

    3.代码实现
    1.修改VoltageAdapter.java 构造器聚合被适配的对象
    package com.sun.objectadapter;
    
    /**
     * Description: 适配器
     * @Author sun
     * @Create 2024/5/29 20:58
     * @Version 1.0
     */
    public class VoltageAdapter implements Voltage5V {
    
        private Voltage220V voltage220V;
    
        // 使用构造器聚合被适配的对象
        public VoltageAdapter(Voltage220V voltage220V) {
            this.voltage220V = voltage220V;
        }
    
        @Override
        public int output5V() {
            // 将220V的电压适配到5V
            int disV = 0;
            if (voltage220V != null) {
                int srcV = voltage220V.output220V();
                disV = srcV / 44;
            }
            return disV;
        }
    }
    
    2.修改Client.java 传入被适配的对象
    package com.sun.objectadapter;
    
    /**
     * Description:
     * @Author sun
     * @Create 2024/5/29 21:03
     * @Version 1.0
     */
    public class Client {
        public static void main(String[] args) {
            Phone phone = new Phone();
            // 给手机装配一个5V的适配器进行充电
            phone.charging(new VoltageAdapter(new Voltage220V()));
        }
    }
    

    4.接口适配器模式

    1.基本介绍

    image-20240531194529065

    2.类图

    image-20240531195619680

    3.目录结构

    image-20240531200449553

    4.代码实现
    1.Interface.java
    package com.sun.interfaceadapter;
    
    /**
     * Description: 一个接口有四个方法,但是普通的类不想全部实现
     * @Author sun
     * @Create 2024/5/31 19:57
     * @Version 1.0
     */
    public interface Interface {
        public void m1();
        public void m2();
        public void m3();
        public void m4();
    }
    
    2.AbsAdapter.java
    package com.sun.interfaceadapter;
    
    /**
     * Description:
     * @Author sun
     * @Create 2024/5/31 19:58
     * @Version 1.0
     */
    public abstract class AbsAdapter implements Interface{
        @Override
        public void m4() {
    
        }
    
        @Override
        public void m3() {
    
        }
    
        @Override
        public void m2() {
    
        }
    
        @Override
        public void m1() {
    
        }
    }
    
    3.ClassA.java
    package com.sun.interfaceadapter;
    
    /**
     * Description: 普通的类重写抽象类的方法
     * @Author sun
     * @Create 2024/5/31 19:59
     * @Version 1.0
     */
    public class ClassA {
        public static void main(String[] args) {
            // 如果想要使用接口的某个方法,就直接使用匿名内部类继承抽象类,重写其中的方法
            AbsAdapter absAdapter = new AbsAdapter() {
                @Override
                public void m1() {
                    System.out.println("重写了m1方法");
                }
            };
            absAdapter.m1();
        }
    }
    
    4.结果

    image-20240531200605292

    适配器模式

    1.引出适配器模式

    1.多功能转换插头

    image-20240529203251649

    2.基本介绍

    image-20240529203509980

    3.工作原理

    image-20240529203741032

    2.类适配器

    1.基本介绍

    image-20240529203956891

    2.类图

    image-20240529205154428

    3.代码实现
    1.Voltage220V.java
    package com.sun.classadapter;
    
    /**
     * Description: 被适配者
     * @Author sun
     * @Create 2024/5/29 20:53
     * @Version 1.0
     */
    public class Voltage220V {
        public int output220V() {
            int src = 220;
            System.out.println("电压输出为" + src + "伏");
            return src;
        }
    }
    
    2.Voltage5V.java
    package com.sun.classadapter;
    
    /**
     * Description: 适配器的接口
     * @Author sun
     * @Create 2024/5/29 20:56
     * @Version 1.0
     */
    public interface Voltage5V {
    
        // 用于将5V的电压适配到220V
        public int output5V();
    }
    
    3.VoltageAdapter.java
    package com.sun.classadapter;
    
    /**
     * Description: 适配器
     * @Author sun
     * @Create 2024/5/29 20:58
     * @Version 1.0
     */
    public class VoltageAdapter extends Voltage220V implements Voltage5V{
        @Override
        public int output5V() {
            // 将220V的电压适配到5V
            int srcV = super.output220V();
            int disV = srcV / 44;
            return disV;
        }
    }
    
    4.Phone.java
    package com.sun.classadapter;
    
    /**
     * Description: 使用者
     * @Author sun
     * @Create 2024/5/29 21:00
     * @Version 1.0
     */
    public class Phone {
        // 依赖一个适配器进行充电
        public void charging(Voltage5V voltage5V) {
            if (voltage5V.output5V() == 5) {
                System.out.println("电压为5V,适配成功,可以开始充电");
            } else {
                System.out.println("电压不为5V,无法充电!");
            }
        }
    }
    
    5.Client.java
    package com.sun.classadapter;
    
    /**
     * Description:
     * @Author sun
     * @Create 2024/5/29 21:03
     * @Version 1.0
     */
    public class Client {
        public static void main(String[] args) {
            Phone phone = new Phone();
            // 给手机装配一个5V的适配器进行充电
            phone.charging(new VoltageAdapter());
        }
    }
    
    6.结果

    image-20240529211353436

    4.类适配器的注意事项

    image-20240529211706653

    3.对象适配器

    1.基本介绍

    image-20240529211827759

    2.使用对象适配器改进类适配器
    1.类图

    image-20240529212625622

    2.介绍

    image-20240529212038831

    3.代码实现
    1.修改VoltageAdapter.java 构造器聚合被适配的对象
    package com.sun.objectadapter;
    
    /**
     * Description: 适配器
     * @Author sun
     * @Create 2024/5/29 20:58
     * @Version 1.0
     */
    public class VoltageAdapter implements Voltage5V {
    
        private Voltage220V voltage220V;
    
        // 使用构造器聚合被适配的对象
        public VoltageAdapter(Voltage220V voltage220V) {
            this.voltage220V = voltage220V;
        }
    
        @Override
        public int output5V() {
            // 将220V的电压适配到5V
            int disV = 0;
            if (voltage220V != null) {
                int srcV = voltage220V.output220V();
                disV = srcV / 44;
            }
            return disV;
        }
    }
    
    2.修改Client.java 传入被适配的对象
    package com.sun.objectadapter;
    
    /**
     * Description:
     * @Author sun
     * @Create 2024/5/29 21:03
     * @Version 1.0
     */
    public class Client {
        public static void main(String[] args) {
            Phone phone = new Phone();
            // 给手机装配一个5V的适配器进行充电
            phone.charging(new VoltageAdapter(new Voltage220V()));
        }
    }
    

    4.接口适配器模式

    1.基本介绍

    image-20240531194529065

    2.类图

    image-20240531195619680

    3.目录结构

    image-20240531200449553

    4.代码实现
    1.Interface.java
    package com.sun.interfaceadapter;
    
    /**
     * Description: 一个接口有四个方法,但是普通的类不想全部实现
     * @Author sun
     * @Create 2024/5/31 19:57
     * @Version 1.0
     */
    public interface Interface {
        public void m1();
        public void m2();
        public void m3();
        public void m4();
    }
    
    2.AbsAdapter.java
    package com.sun.interfaceadapter;
    
    /**
     * Description:
     * @Author sun
     * @Create 2024/5/31 19:58
     * @Version 1.0
     */
    public abstract class AbsAdapter implements Interface{
        @Override
        public void m4() {
    
        }
    
        @Override
        public void m3() {
    
        }
    
        @Override
        public void m2() {
    
        }
    
        @Override
        public void m1() {
    
        }
    }
    
    3.ClassA.java
    package com.sun.interfaceadapter;
    
    /**
     * Description: 普通的类重写抽象类的方法
     * @Author sun
     * @Create 2024/5/31 19:59
     * @Version 1.0
     */
    public class ClassA {
        public static void main(String[] args) {
            // 如果想要使用接口的某个方法,就直接使用匿名内部类继承抽象类,重写其中的方法
            AbsAdapter absAdapter = new AbsAdapter() {
                @Override
                public void m1() {
                    System.out.println("重写了m1方法");
                }
            };
            absAdapter.m1();
        }
    }
    
    4.结果

    image-20240531200605292

  • 相关阅读:
    java毕业设计校园便利店信息系统开发源码+lw文档+mybatis+系统+mysql数据库+调试
    【计算机网络】UDP协议
    详细刨析Linux权限。包含权限的概念、权限的修改、粘滞位等等。
    Windows 利用Anaconda创建pytorch等环境
    基于ssm+vue+uniapp的电影交流平台小程序
    vue.js毕业设计,基于vue.js前后端分离教室预约系统(H5移动项目) 开题报告
    附幻灯片下载|图解国标《网络数据分类分级要求(征)》
    完全可复制、经过验证的 Go 工具链
    【论文阅读 CIKM‘2021】Learning Multiple Intent Representations for Search Queries
    了解多人游戏下的客户端与服务器体系结构
  • 原文地址:https://blog.csdn.net/m0_64637029/article/details/139609483