外观模式
1、模式动机
引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。
2、模式定义
- 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
模式结构
模式角色
- Facade: 外观角色
- SubSystem:子系统角色
3、模式分析
- 根据“单一职责原则”,在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。
- 外观模式也是“迪米特法则”的体现,通过引入一个新的外观类可以降低原有系统的复杂度,同时降低客户类与子系统类的耦合度。
- 外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。
- 外观模式的目的在于降低系统的复杂程度。
- 外观模式从很大程度上提高了客户端使用的便捷性,使得客户端无须关心子系统的工作细节,通过外观角色即可调用相关功能。
(1)典型的外观角色代码:
4、模式案例与分析
- 实例一:电源总开关
现在考察一个电源总开关的例子,以便进一步说明外观模式。为了使用方便,一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。通过该电源总开关可以同时控制上述所有电器设备,使用外观模式设计该系统。
package 外观模式2;
//外观角色
public class GeneralSwitchFaceade {
private Light[] lights =new Light[4];
private Fan fan;
private AirConditssioner ac;
private Televisions tv;
public GeneralSwitchFaceade(){
lights[0] = new Light("左前");
lights[1] = new Light("右前");
lights[2] = new Light("左后") ;
lights[3] = new Light("右后") ;
ac = new AirConditssioner();
fan = new Fan();
tv = new Televisions();
}
public void on()
{
lights[0].on();
lights[1].on();
lights[2].on();
lights[3].on();
ac.on();
fan.on();
tv.on(