外观模式:
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
有一个面向客户代码的外观类Facade,该外观类向客户代码提供了一组接口,每一接口可能封装了子系统的一系列操作,但是一系列的操作对客户代码是隐藏的,而对于外观类则是开放的。
通俗的说:假设客户代码为了实现某个功能,需要从多个子系统中调用多个方法。如果直接调用,那么将极大增强了代码间的耦合性,同时也为代码的后期维护埋下了很大的隐患,加大了后期维护的成本。这个时候,使用外观类,该外观类保存了需要使用到的所有子系统的引用,并根据客户代码的不同需求,将一组子类的某些操作封装成一个简单的接口提供给客户代码使用。
现在用实际例子来描述外观模式的用处:
假设公司附近一家餐厅里有三位厨师,分别专攻肉类,蔬菜类,汤类。该餐厅根据多数人的用餐需求,将食物归类成套餐的形式供应给上班族。
上班族只需要告诉Waiter 自己需要哪个套餐就能在一次点餐过程中完成对肉类蔬菜类和汤类食物的订制。
在这里,我们可以将三位厨师看成是三个不同的子系统,Waiter 是Facade 外观,Waiter 从厨师那里获得不同的食物并组合成相应的套餐来供应为顾客,相当于将三分食物包含在一个接口里,并提供为顾客
1. 定义一个MeatCook 厨师类,该厨师主要负责烹饪肉类食物
2.再分别创建 VegetableCook 和 SoupCook 类,这两个厨师分别负责 蔬菜和汤的烹饪
3.创建 外观类Waiter 。 Waiter 类保存了 三个子系统(COOK) 的引用,并为客户代码提供两个接口。
4. 编写测试代码来验证代码的正确性:
测试代码要求Waiter 分别提供 套餐A 和 套餐B
‘
结果输出:
beef
eggSoup
cabbage
-----------------
pork
eggSoup
potato
通过实验结果我们可以看到,外观 的作用就是将其他多个类得多个操作封装成一个简单的接口提供给客户代码。