适配器模式,也是比较熟悉,最近两个系统整合的时候还用到了,不过这次看书,发觉我过去用的都是对象适配器,就是通过构造函数传递要被转换的类。
还有个叫类适配器,继承需要被转换的类。思想是一样,只是这样如果要转换多个,因为 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 代码逻辑简单。
装饰者是一种包装,是从一个接口的根子上下来,是扩展它兄弟的功能。
适配器也是对类的包装,但是从两个根子上下来,把一个转成另一个。
外观是对类的包装,提供一个方法,封装好了算法流程。

网友评论