zoukankan      html  css  js  c++  java
  • 一天一个设计模式——Adapter适配器模式(Wrapper模式)

    一、模式说明

      在现实生活中,当需要将两种设备连接起来,但是两个设备的接口规范又不一致(比如电脑上只有Type-C接口,但是你的显示器是HDMI接口),这时候就需要一个适配器,适配器一端连接电脑,一端连接屏幕。有了这个适配器,我们不需要重新买HDMI接口电脑的电脑,就可以达到我们连接外置显示器的目的。

      在程序设计领域,很多时候我们的工作是在现有类的基础上继续开发的,如果这个类已经实现了我们要的功能且该类经过充分测试(修改它可能会引入bug),但是接口不符合当前程序环境规范,需要适当转换,这时就用到了Adapter模式的设计思想,创建一个Adapter适配器(Wrapper包装器),使原有的类能适应新的程序环境。

    二、模式分类

    Adapter模式有以下两种:

    • 类适配器模式(使用继承的适配器)

    • 对象适配器模式(使用委托的适配器)

    三、适配器模式中的角色

    • Target对象:负责定义所需要的方法,具体的业务需求(如上面例子中的HDMI视频接口);
    • Client请求者:负责使用Target角色定义的方法做具体处理(如上面例子中的显示器,使用Target提供的HDMI接口来显示图像);
    • Adaptee被适配:一个持有既定方法的角色(如面例子中的笔记本电脑,持有Type-C接口输出);
    • Adapter适配器:Adapter模式的主人公,使用Adaptee的方法来满足Target的需求;

    四、代码示例

    使用继承的类适配器:

    TypeCVideo类(Adaptee):

    package com.designpattern.cn.adapterpattern;
    
    public class TypeCVideo {
        private String videoContent;
    
        public TypeCVideo(String videoContent){
            this.videoContent = videoContent;
        }
    
        public void typecOut(){
            System.out.println(videoContent);
        }
    }
    View Code

    ShowHdmiVideo类(Target对象):

    package com.designpattern.cn.adapterpattern;
    
    public interface ShowHdmiVideo {
        public abstract void HdmiOut();
    }
    View Code

    TypeCToHdmiCable类(Adapter类):

    package com.designpattern.cn.adapterpattern;
    
    /**
     * <p>TypeCToHdmiCable TypeC转HDMI线 适配器类</p>
     */
    public class TypeCToHdmiCable extends TypeCVideo implements ShowHdmiVideo {
    
        //TypeC转HDMI线 TypeCToHdmiCable类继承了TypeCVideo类
        public TypeCToHdmiCable(String videoContent){
            super(videoContent);//设置父类的视频内容videoContent字段
        }
        @Override
        public void HdmiOut() {
            typecOut();
        }
    }
    View Code

    测试运行结果:

    上面的例子,通过继承TypeCVideo的方式创建新的类,并实现新业务需要的HDMI接口,从而将TypeC中视频流(Video Streaming字符串)从HDMI接口输出处来。

    使用委托的对象适配器模式:

    【委托:委托的意思就是交给他人,自己因为某些原因做不了的事情,将事情吩咐给别人做,在JAVA中,委托就是将某个方法中的实际处理交给其他实例的方法】

    将上述ShowHdmiVideo接口改为ShowHdmiVideo类:

    package com.designpattern.cn.adapterpattern;
    
    public abstract class ShowHdmiVideo{
        public abstract void HdmiOut();
    }
    View Code

    TypeCToHdmi适配器类修改如下:

    package com.designpattern.cn.adapterpattern;
    
    /**
     * <p>TypeCToHdmiCable TypeC转HDMI线 适配器类</p>
     */
    public class TypeCToHdmiCable extends ShowHdmiVideo {
        private TypeCVideo typeCVideo;
    
        public TypeCToHdmiCable(String videoContent){
            this.typeCVideo = new TypeCVideo(videoContent);
        }
    
        //当适配器HDMI视频输出方法被调用的时候,并不是TypeCToHdmiCable这个适配器类自己进行处理,而是交给了TypeCVideo类实例的typec输出
        public void HdmiOut() {
            typeCVideo.typecOut();
        }
    }
    View Code

    其他定义保持不变,再次运行程序,结果相同:

    五、相关的设计模式:

    • Bridge桥接模式:Adapter模式用于连接两个接口不同的类;而Bridge模式用于连接类的功能层次结构与实现层次结构。
    • Decorator装饰器模式:Adapter模式用于填补不同接口之间的缝隙(接口不兼容),而Decorator装饰器模式用于在不改变API接口的前提下,增强功能(Spring中的IO流,数据源,都使用了Decorator模式包装)。
  • 相关阅读:
    hdu 1754 I Hate It(线段树水题)
    hdu 1166敌兵布阵(线段树入门题)
    多校1007 Naive Operations
    51NOD 1277 字符串中的最大值(KMP)
    括号匹配
    Visual Studio中定义OVERFLOW不能用
    数据结构第二章小节
    关键字new与malloc函数
    构造函数不能为虚/重载函数总结
    预处理之宏定义
  • 原文地址:https://www.cnblogs.com/zheng-hong-bo/p/11069440.html
Copyright © 2011-2022 走看看