设计模式3.7 门面模式
2018-12-02 本文已影响0人
卢卡斯哔哔哔
点击进入我的博客
门面模式(Facade Pattern)要求一个子系统的外部与其内部通信,必须通过一个统一的门面对象进行。
3.7.1 门面模式结构
门面模式没有一个一般化的类图描述,可以用下面的例子来说明。
门面模式
- 门面(Facade)角色:外部可以调用这个角色的方法。此角色知道子系统的功能和责任。
- 子系统(Subsystem)角色:可以有多个子系统,子系统不需要知道门面的存在。
3.7.2 细节
门面数量
通常只需要一个门面类,而且只有一个实例,因此可以设计称单例模式。当然也可有多个类。
使用场景
- 为一个复杂的子系统提供一个简单的接口
- 使子系统和外部分离开来
- 构建一个层次化系统时,可以使使用Facade模式定义系统中每一层,实现分层。
优点
- 减少系统之间的相互依赖。
- 提高了安全性。
缺点
- 不符合开闭原则
- 如果要改东西很麻烦,继承重写都不合适。
Java例子
MVC三层结构
3.7.3 KFC例子
假如没有服务员(门面),顾客(外部系统)要点一个套餐需要知道每个套餐包含的食物(子系统)种类,这样就会非常麻烦,所以最好的方式是直接告诉服务员套餐名称就好了。
public class Customer {
public static void main(String[] args) {
Waiter waiter = new Waiter();
List<Food> foodList = waiter.orderCombo("Combo1");
}
}
abstract class Food {}
class MiniBurger extends Food {}
class MexicanTwister extends Food {}
class CornSalad extends Food {}
class HotWing extends Food {}
class PepsiCola extends Food {}
class Waiter {
public List<Food> orderCombo(String comboName) {
List<Food> foodList;
switch (comboName) {
case "Combo1" :
foodList = Arrays.asList(new MiniBurger(), new CornSalad(), new PepsiCola());
break;
case "Combo2":
foodList = Arrays.asList(new MexicanTwister(), new HotWing(), new PepsiCola());
break;
default:
foodList = new ArrayList<>();
}
return foodList;
}
}