引言
网上有很多介绍设计模式系列的优秀文章,看懂不一定是真懂,能写出来,说出个1、2、3点才算是真的懂了,如果能灵活的应用到工作中才算是真的熟练。
1、模式场景
餐馆里面只要跟接待员说:来一份鱼香肉丝。服务员会把这道菜端到你面前,至于中间的下单、烹饪、上菜等细节,我们并不关心。
2、模式结构
Facade: 外观角色(模拟场景中的接待员)
SubSystem:子系统角色(模拟场景中下单、烹饪、上菜服务)
3、示例代码
3.1、外观角色
public class Receptionist {
private OrderOfficer orderOfficer;
private Cook cook;
private Waiter waiter;
public Receptionist(){
orderOfficer = new OrderOfficer();
cook = new Cook();
waiter = new Waiter();
}
public void service(String name){
//下单
orderOfficer.saveOrder(name);
//烹饪
cook.cooking(name);
//上菜
waiter.waiter(name);
}
}
3.2、子系统(下单)
public class OrderOfficer {
public void saveOrder(String name){
System.out.println(name + "下单成功");
}
}
3.3、子系统(烹饪)
public class Cook {
public void cooking(String name){
System.out.println(name + "烹饪完成");
}
}
3.4、子系统(上菜)
public class Waiter {
public void waiter(String name){
System.out.println(name + "端到用户的桌上");
}
}
3.5、客户端测试
public class Client {
public static void main(String[] args) {
Receptionist receptionist = new Receptionist();
receptionist.service("鱼香肉丝");
}
}
控制台输出:
鱼香肉丝下单成功
鱼香肉丝烹饪完成
鱼香肉丝端到用户的桌上
4、模式优点
- 客户端与子系统松耦合,客户端代码变得简单。
- 提供了统一访问的入口,子系统的修改不会应该到外观系统的代码。
5、模式缺点
- 不引入抽象外观类的情况下,新增子系统会影响到外观系统的代码。
结束语
JDK中的日志框架Logger使用了外观模式,也称门面模式。下一篇:设计模式——代理模式。