门面模式也叫外观模式,是八种结构型模式之一。不管是门面或外观,意思都是提供想让外人看到的部分,隐藏不想被外人看到的部分。从代码角度理解,就是服务提供方通过门面模式来公开对外服务,隐藏内部服务实现的细节。
门面模式的实现可通过两种方法:接口整合和接口隔离。下面我们用伪代码来举例说明:
接口整合例子:
服务提供方有A、B、C三个接口,调用方实现某个功能需要依次调用ABC三个接口。这样的设计增加了调用方调用的成本和调用的复杂度。可以使用门面模式通过接口整合的方法,把ABC三个接口整合成一个门面接口X,调用方只需要调用X接口就可以了。
interface A {
public void doa();
public void executea();
}
interface B {
public void dob();
public void executeb();
}
interface C {
public void doc();
}
//门面接口
interface Facade {
public void dox();
public void executex();
}
//门面类
class XFacade implements Facade{
A a;
B b;
C c;
XFacade(A a, B b, C c) {
this.a = a; this.b = b; this.c = c;
}
//整合abc三个接口
public void dox() {
a.doa();
b.dob();
c.doc();
}
//整合ab两个接口
public void executex() {
a.executea();
b.executeb();
}
}
接口隔离例子:
服务方接口A有多个方法,但是调用方只需要其中一个方法。如果直接提供A,就违反了接口隔离原则。可以使用门面模式通过接口隔离的方法,只提供调用方需要的方法。
interface A {
//action是调用方法要调用方法
public void action();
public void execute();
...其他方法
}
//门面接口
interface Facade {
public void action();
}
//门面类
class XFacade implements Facade{
A a;
XFacade(A a) {
this.a = a;
}
//开放action方法,隔离其他方法
public void action() {
a.action();
}
}
门面模式跟适配器模式很像,区别之一适配器模式是调用方才会运用的模式,门面模式是被调用方才会运用的模式。