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


    适配器模式

    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

  • 相关阅读:
    以太坊学习笔记(五)DAPP 开发环境
    详谈一下:Java中的基本类型变量(8种)与引用类型变量的区别
    Java中xml转javaBean
    深度学习分析NASA电池数据(1 数据读取)
    【计算机网络】UDP协议
    FPT(Pretrained Transformer) 2022AAAI
    001 Creating your first app with PySide6
    高防云服务器租用怎么选?
    wpf工程这种左下角有箭头的文件夹是如何创建的,它似乎是引用了共享项目
    架构问题:技术选型
  • 原文地址:https://blog.csdn.net/m0_64637029/article/details/139609483