一天一个设计模式——Adapter适配器模式(Wrapper模式)

1、模式说明设计模式

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

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

2、模式分类测试

Adapter模式有如下两种:this

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

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

3、适配器模式中的角色spa

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

4、代码示例设计

使用继承的类适配器:3d

TypeCVideo类(Adaptee):code

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

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

 

5、相关的设计模式:

  • Bridge桥接模式:Adapter模式用于链接两个接口不一样的类;而Bridge模式用于链接类的功能层次结构与实现层次结构。
  • Decorator装饰器模式:Adapter模式用于填补不一样接口之间的缝隙(接口不兼容),而Decorator装饰器模式用于在不改变API接口的前提下,加强功能(Spring中的IO流,数据源,都使用了Decorator模式包装)。
相关文章
相关标签/搜索