• Java 设计模式之适配器模式,Java 类适配器,Java 对象适配器


    Java 设计模式之适配器模式,

    Java 类适配器,

    Java 对象适配器

    ================================

    ©Copyright 蕃薯耀 2021-06-30

    https://www.cnblogs.com/fanshuyao/

    一、类适配器

    1、目标接口

    public interface IVoltage {
    
        public int output();
    }

    2、目标类

    public class Voltage220 implements IVoltage{
    
        @Override
        public int output() {
            System.out.println("电源输出220V电压");
            return 220;
        }
    
    }

    3、类适配器(适配器英文是:Adapter,非Adaptor,示例中写错了)

    /**
     * 类适配器,通过继承目标类(Voltage220)和实现目标接口(IVoltage)
     *
     */
    public class Voltage10Adaptor extends Voltage220 implements IVoltage{
    
        @Override
        public int output() {
            int v220 = super.output();
            int v10 = v220 / 22;
            System.out.println("适配器输出"+ v10 +"V电压");
            return v10;
        }
    
    }

    4、手机类

    public class Mobile {
    
        private IVoltage iVoltage;
        
        
        public IVoltage getiVoltage() {
            return iVoltage;
        }
    
    
        public void setiVoltage(IVoltage iVoltage) {
            this.iVoltage = iVoltage;
        }
        
        
        public Mobile(IVoltage iVoltage) {
            super();
            this.iVoltage = iVoltage;
        }
    
    
        //充电
        public void charge() {
            if(this.iVoltage.output() != 10) {
                System.out.println("电压(" + this.iVoltage.output() + ")不匹配,手机不能充电");
                
            }else {
                System.out.println("手机正在充电…");
            }
        }
    }

    5、客户端测试类

    public class Client {
    
        public static void main(String[] args) {
            
            
            
            Voltage220 voltage220 = new Voltage220();
            //voltage220.output();
            
            Mobile m = new Mobile(voltage220);
            m.charge();
            
            
            System.out.println("-------------------------------");
            
            
            Mobile m2 = new Mobile(new Voltage10Adaptor());
            m2.charge();
        }
    }

    测试结果:

    电源输出220V电压
    电源输出220V电压
    电压(220)不匹配,手机不能充电
    -------------------------------
    电源输出220V电压
    适配器输出10V电压
    手机正在充电…

    二、对象适配器

    1、对象适配器类

    /**
     * 对象适配器,就是不继承目标类,而是通过在适配器中增加目标类的对象,以构造方法注入对象的方式,解决类只能单继承的问题,因为适配器如果继承了其它类,就不能再继承目标类
     *
     */
    public class Voltage10AdaptorObject implements IVoltage{
    
        private IVoltage iVoltage;
    
        public Voltage10AdaptorObject(IVoltage iVoltage) {
            this.iVoltage = iVoltage;
        }
    
    
        @Override
        public int output() {
            int vTarget = this.iVoltage.output();
            int vAdaptor = 0;
            
            if(vTarget == 220) {
                vAdaptor = vTarget / 22;
                
            }else if(vTarget == 110) {
                vAdaptor = vTarget / 11;
            }
            
            System.out.println("适配器输出"+ vAdaptor +"V电压");
            return vAdaptor;
        }
    
    }

    2、客户端测试类

    public class Client {
    
        public static void main(String[] args) {
            
            
            
            Voltage220 voltage220 = new Voltage220();
            //voltage220.output();
            
            Mobile m = new Mobile(voltage220);
            m.charge();
            
            
            System.out.println("-------------------------------");
            
            
            Mobile m2 = new Mobile(new Voltage10Adaptor());
            m2.charge();
            
            System.out.println("+++++++++++++++++++++++++++++");
            
            
            Mobile m3 = new Mobile(new Voltage10AdaptorObject(voltage220));
            m3.charge();
        }
    }

    测试结果:

    电源输出220V电压
    电源输出220V电压
    电压(220)不匹配,手机不能充电
    -------------------------------
    电源输出220V电压
    适配器输出10V电压
    手机正在充电…
    +++++++++++++++++++++++++++++
    电源输出220V电压
    适配器输出10V电压
    手机正在充电…

    三、总结

    适配器模式(Adapter Pattern)

    将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

    适配器模式的适用环境:

    系统需要使用一些现有的类,而这些类的接口(方法)不符合系统的需要,甚至没有这些类的源代码创建一个可以重复使用的类,现在就可以使用适配器模式。

    三个角色:

    1:Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,一般是接口,因为类是单继承(不好)。

    2:Adaptee(适配者类):适配者即需要被适配的角色,它定义了一个已经存在的接口(方法),这个接口需要适配。

    3:Adapter(适配器类):作为一个转换器,需要实现Target类,对Adaptee和Target进行适配。它是适配器模式的核心。

    尽量使用对象的适配器模式,多用合成/聚合、少用继承。

    对于类适配器,适配器可以重定义的部分行为,相当于子类覆盖父类的部分实现方法。

    (时间宝贵,分享不易,捐赠回馈,^_^)

    ================================

    ©Copyright 蕃薯耀 2021-06-30

    https://www.cnblogs.com/fanshuyao/

    今天越懒,明天要做的事越多。
  • 相关阅读:
    用C++读写EXCEL文件的几种方式比较
    20个值得收藏的网页设计开放课件
    char* 应用, 去除字符串内多余空格, 用算法而非库函数
    东拉西扯:王建硕主义
    Lisp 的本质(The Nature of Lisp)
    web前端:html
    [原译]理解并实现原型模式实现ICloneable接口.理解深浅拷贝
    [原译]理解并实现装饰器模式
    3分钟理解Lambda表达式
    [原译]实现IEnumerable接口&理解yield关键字
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/14953776.html
Copyright © 2020-2023  润新知