zl程序教程

您现在的位置是:首页 >  后端

当前栏目

2022-10-05-适配器和外观模式

模式 2022 10 05 适配器 外观
2023-06-13 09:13:50 时间

适配器模式,也是比较熟悉,最近两个系统整合的时候还用到了,不过这次看书,发觉我过去用的都是对象适配器,就是通过构造函数传递要被转换的类。

还有个叫类适配器,继承需要被转换的类。思想是一样,只是这样如果要转换多个,因为 Java 不支持多继承,就只能用构造函数了。再回过头看《Head First 设计模式》,原来也讲了,但是毫无印象,当年大概看到 Java 不能用,就没怎么看。

还有个外观模式(门面模式),和对象适配器很像,用来简化接口,让调用者和具体子类解耦,就是原来外面要做一件事,要调用多个对象的各种方法。

public class Client {
    public void test(A a, B b, C c) {
        a.do1();
        int r = a.do2();
        b.do1();
        b.do2(r);
        c.do();
    }
}

如果很多地方都需要这一套逻辑,一般直接在类内部提取一个方法,如果在许多类里都用,可能写到一个静态方法去了。

而外观模式是写一个专门的类封装

public class ABC {
    A a;
    B b;
    C c;
    public ABC(A a, B b, C c) {
        // 赋值
    }

    public void doSth() {
        a.do1();
        int r = a.do2();
        b.do1();
        b.do2(r);
        c.do();
    }
}

public class Client {
    public void test(A a, B b, C c) {
        ABC abc = new ABC(a, b, c);
        abc.doSth();
    }
}

一定要说出好处,就是封装后,Client 只需要和 ABC 打交道,符合什么最少知识原则之类的。如果要修改 doSth 的调用逻辑,对 Client 透明,ABC 自己修改就行。

但好像也没什么,封装方法同样是这效果。并且如果仅仅是一个地方调用,那都是一样,要修改了,不是修改 Client 就是要修改 ABC,也没省事,而且作为方法内部逻辑,Client 修改也影响不了它自己的其它部分。

看到有一个好处,说是风格问题,这可以接受,Client 的风格可以一致,要修改都到 ABC 去修改,好处还是有的,起码在 ABC 里改比在 Client 里改动看着清爽,因为 ABC 代码逻辑简单。


装饰者是一种包装,是从一个接口的根子上下来,是扩展它兄弟的功能。

适配器也是对类的包装,但是从两个根子上下来,把一个转成另一个。

外观是对类的包装,提供一个方法,封装好了算法流程。

装饰适配器外观.png