当我们考虑买车时,在走进4S店后,会有热情的销售人员来接待我们。他会带着我们走完一整套的购车流程。在这一过程中,销售人员就充当了门面这一角色,他很熟悉这一套流程,而且很多时候我们只需要等到他办手续就可以了不需要我们亲力亲为。那么试想一下,要是没有销售人员,我们势必会在买车上有很多的不便,可见其重要性。
那么反应在系统上亦是如此,现在的系统功能繁杂,最好的处理方式就是分而治之,但拆分后的子系统如何管理呢,这时就需要一个门面角色、该角色需要知道划分给它的子系统的一些功能(熟悉),这些功能 通常是提供给子系统外部使用的方法,当然也有些内部模块相互调用的方法(办手续),这些不对外提供。
接下来就以汽车销售人员李明为例写个简单的demo,如下所示:
public class Facade {
public static void main(String[] args) {
SalesConsultant sc = new SalesConsultant();
sc.start("开始");
}
}
// 汽车流程
interface CarFlow {
// 接待
void reception();
// 报价
void offer();
// 向经理询问底价(内部调用)
int askReservePriceToManager();
// 成交
void makeABargain();
}
// 李明接待客户的流程
class LiMingCarFlow implements CarFlow {
@Override
public void reception() {
System.out.println("李明开始接待客户");
}
@Override
public void offer() {
int price = askReservePriceToManager();
System.out.println("李明向用户报价" + price);
}
@Override
public int askReservePriceToManager() {
System.out.println("李明向经理询问底价");
return 50000;
}
@Override
public void makeABargain() {
System.out.println("最终成交了");
}
}
//销售顾问
class SalesConsultant {
CarFlow carFlow = new LiMingCarFlow();
public void start(String content){
carFlow.reception();
carFlow.offer();
carFlow.makeABargain();
}
}
最终执行结果:
李明开始接待客户
李明向经理询问底价
李明向用户报价50000
最终成交了
在这个过程中,李明的接待、报价和成交对客户来说是透明的。只不过李明在报价前,先内部向经理询问了价格,这个对客户来说是隐蔽的。
总结:
- 门面模式其实相当于一个对外开放的接口,可以方便外部调用,不需要知道具体的实现细节。
- 它松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
- 能够有选择性地暴露方法。避免客户端调用不需要的内部方法。