专栏首页架构探险之道[设计模式] 适配器模式 + 外观模式

[设计模式] 适配器模式 + 外观模式

[设计模式] 适配器模式 + 外观模式

手机用户请 横屏获取最佳阅读体验, REFERENCES中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。

平台

地址

CSDN

https://blog.csdn.net/sinat_28690417

简书

https://www.jianshu.com/u/3032cc862300

个人博客

https://yiyuery.github.io/NoteBooks/

适配器模式

适配器模式: 将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

适配器有两种,一种是类适配器,另一种是对象适配器。

对象适配器

利用组合的方式将请求传送给被适配器

UML

顾名思义, ProductV2API是新的API接口, ProductV1API为历史API接口,实现类 HisAPIAdaptee为历史API的实现类,即被适配者。

代码

历史接口 & 实现

public interface ProductV1API {

    /**
     * V1 版本产品接口
     */
    void specificRequest();
}

public class HisAPIAdaptee implements ProductV1API {
    /**
     * V1 版本产品接口
     */
    @Override
    public void specificRequest() {
        System.out.println("Adaptee specificRequest");
    }
}

适配器实现新的接口,并传入历史接口的实现类(被适配者)

public class APIAdapter implements ProductV2API {

    private HisAPIAdaptee adaptee;

    public APIAdapter(HisAPIAdaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }


}

客户端调用

//客户端程序
public class Client {

    public static void main(String[] args) {
        //老接口使用
        HisAPIAdaptee hisAPIAdaptee = new HisAPIAdaptee();
        hisAPIAdaptee.specificRequest();

        //适配后新接口对外暴露使用
        new APIAdapter(hisAPIAdaptee).request();
    }
}

类适配器

利用多重继承实现,请求传送给被被适配者

APIAdapter 继承 ProductV1APIProductV2API的实现类,在适配器内部实现请求方法的转发。

但是Java中不允许这样做!

适配器和装饰者模式

各自特点

  • 适配器用来封装接口,解决接口版本迭代对客户端的兼容问题,适配器将一个接口转成另一个接口
  • 装饰者模式用来包裹对象,补充对象属性,被装饰者可以被装饰器替代使用,支持多层嵌套。
  • 装饰者模式不改变接口,但是加入责任

相似点

  • 都是通过包裹将操作委派给被装饰者和被适配者
  • 都会实现公共接口或是抽象基类

外观模式

外观模式:提供一个统一的接口,用来访问子系统的一群接口,外观定义了一个高层接口,让子系统更容易使用

UML

//定义外观行为
public interface Facade {

    /**
     * 开启
     */
    void on();

    /**
     * 关闭
     */
    void off();
}

//实现外观行为并针对每个子系统进行统一的外观包装


//灯光控制
public class LightAPI implements Facade {
    /**
     * 开启
     */
    @Override
    public void on() {
        System.out.println("Light turned on!");
    }

    /**
     * 关闭
     */
    @Override
    public void off() {
        System.out.println("Light turned off!");
    }
}

//TV控制
public class TVAPI implements Facade {
    /**
     * 开启
     */
    @Override
    public void on() {
        System.out.println("TV turned on!");
    }

    /**
     * 关闭
     */
    @Override
    public void off() {
        System.out.println("TV turned off!");
    }
}

//全局外观控制
public class FacadeImpl implements Facade {

    LightAPI light = new LightAPI();
    TVAPI tv = new TVAPI();

    /**
     * 开启
     */
    @Override
    public void on() {
        light.on();
        tv.on();
    }

    /**
     * 关闭
     */
    @Override
    public void off() {
        light.off();
        tv.off();
    }
}

外观行为的接口定义可以换成其他具体类,非必要实现,外观模式的重点的是封装一批接口,对外提供一个高层接口。

设计原则:

  • 最少知识原则(只和亲密的朋友交谈)

总结

适配器模式

  • 当一个现有的类的使用,但是对应接口无法符合你的需要时,可以使用。
  • 可以改变接口以符合客户的期望
  • 适配器实现的复杂度和目标接口的大小和复杂度成正比
  • 类适配器需要使用多重继承,Java中无法使用
  • 适配器讲一个对象包装起来以改变其接口

外观模式:

  • 将客户从一个复杂子系统中解耦,提供一个高层次的应用接口。
  • 不同子系统接口的组合可以实现多个外观,视需求和接口复杂度而定。
  • 将一群对象包装起来以简化其接口

装饰者模式:

  • 将一个对象包装起来,以增加新的行为和责任

本文分享自微信公众号 - 架构探险之道(zacsnz1314),作者:MasterYang

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [设计模式] 命令模式

    假定我们定义一个宏命令实现回家后的一个智能操作:包含开灯和开电视,并要求它支持撤销能力。

    架构探险之道
  • [Spring Boot] Spring boot 整合mybatis、postgresql [Gradle构建项目]

    架构探险之道
  • [Spring Boot] 配置文件加载[超详细]

    2、 @PropertySource(value="classpath:props.properties")方式

    架构探险之道
  • [C#1] 11-接口

    接口与继承 CLR规定一个类型只能有一个基类型,这种继承成为单继承; 接口继承是指一个类型继承的是接口中的方法签名,而非方法实现,通常称为实现接口; 接口仅仅是...

    blackheart
  • 深入MyBatis源码,理解Java设计模式之适配器模式

    须臾之余
  • Java设计模式(一)适配器模式

    一天无意中在github上搜索,发现了在Java领域stars排名最多的一个项目:iluwatar/java-design-patterns 里面总结了许多在...

    每天学Java
  • 适配器模式

    适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适...

    xiangzhihong
  • java接口

    接口中常量的修饰关键字:public,static,final(常量) 函数的修饰关键字:public,abstract 如果没有写全,系统在编译时会自动加上 ...

    用户3030674
  • 10.JAVA-接口、工厂模式、代理模式、详解

    接口属于一个特殊的类,这个类里面只能有抽象方法和全局常量 (该概念在JDK1.8之后被打破,在1.8后接口中还可以定义普通方法和静态方法,在后续章节会详讲)

    张诺谦
  • 深入理解 Java 中 SPI 机制

    SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,本文由浅入深地介绍了Java SPI机制。

    2020labs小助手

扫码关注云+社区

领取腾讯云代金券