一.模式定义
- 外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
二.模式结构
• Facade: 外观角色,为多个子系统对外提供一个共同的接口。
• SubSystem:子系统角色,实现系统的部分功能,客户可以通过外观角色访问它。
典型的外观角色代码:‘
1 public class Facade
2 {
3 private SubSystemA obj1 = new SubSystemA();
4 private SubSystemB obj2 = new SubSystemB();
5 private SubSystemC obj3 = new SubSystemC();
6 public void method()
7 {
8 obj1.method();
9 obj2.method();
10 obj3.method();
11 }
12 }
模式实例-电源总开关
- 外观角色类
//外观角色类
2 public class GeneralSwitchFacade {
3 private Light lights[]=new Light[4];
4 private Fan fan;
5 private AirConditioner ac;
6 private Television tv;
7
8 public GeneralSwitchFacade()
9 {
10 lights[0]=new Light("左前");
11 lights[1]=new Light("右前");
12 lights[2]=new Light("左后");
13 lights[3]=new Light("右后");
14 fan=new Fan();
15 ac=new AirConditioner();
16 tv=new Television();
17 }
18 //开灯业务
19 public void on()
20 {
21 lights[0].on();
22 lights[1].on();
23 lights[2].on();
24 lights[3].on();
25 fan.on();
26 ac.on();
27 tv.on();
28 }
29 //关灯业务
30 public void off()
31 {
32 lights[0].off();
33 lights[1].off();
34 lights[2].off();
35 lights[3].off();
36 fan.off();
37 ac.off();
38 tv.off();
39 }
40 }
- 子系统类 Light
public class Light
{
private String position;
public Light(String position)
{
this.position=position;
}
public void on()
{
System.out.println(this.position + "灯打开!");
}
public void off()
{
System.out.println(this.position + "灯关闭!");
}
}
- 子系统类 Fan
public class Fan
{
public void on()
{
System.out.println("风扇打开!");
}
public void off()
{
System.out.println("风扇关闭!");
}
}
- 子系统类 AirConditioner
public class AirConditioner
{
public void on()
{
System.out.println("空调打开!");
}
public void off()
{
System.out.println("空调关闭!");
}
}
- 子系统类 Television
public class Television
{
public void on()
{
System.out.println("电视机打开!");
}
public void off()
{
System.out.println("电视机关闭!");
}
}
三.使用场景
在以下情况下可以使用外观模式:
• 当要为一个复杂子系统提供一个简单接口时可以使用外观模式。该接口可以满足大多数用户的需求,而且用户也可以越过外观类直接访问子系统。
• 客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。
• 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。