模式定义
外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是一种对象结构型模式。
模式结构
模式结构如下图所示:
Facade
在客户端可以调用这个角色的方法,在外观角色中可以知道相关的子系统的功能和责任;在正常情况下,它将所有客户端发来的请求委派到相应的子系统中去,传递给相应的子系统对象处理。SusSystem
在软件系统中可以同时有一个或多个子系统角色,每一个子系统可以不是一个单独的类,而是类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传来的请求;子系统并不知道外观的存在,对于子系统而言,外观仅仅是另一个客户端而已。
实例
为了使用方便,一个电源总开关可以控制四盏灯、一台电视机和一台空调的启动和关闭。通过该电源总开关可以同时控制所有上述电器设备,使用外观模式设计该系统。
该实例类图如下所示:
public class Light {
private int no;
public Light(int no) {
this.no = no;
}
public void on() {
System.out.println(this.no + "灯打开");
}
public void off() {
System.out.println(this.no + "灯关闭");
}
}
public class AirConditional {
public void on() {
System.out.println("空调打开");
}
public void off() {
System.out.println("空调关闭");
}
}
public class Television {
public void on() {
System.out.println("电视打开");
}
public void off() {
System.out.println("电视关闭");
}
}
public class GeneralSwitchFacade {
private Light linght[] = new Light[4];
private AirConditional ac;
private Television tv;
public GeneralSwitchFacade() {
light[0] = new Light(1);
light[1] = new Light(2);
light[2] = new Light(3);
light[3] = new Light(4);
ac = new AirConditional();
tv = new Television();
}
public void on() {
light[0].on();
light[1].on();
light[2].on();
light[3].on();
ac.on();
tv.on();
}
public void off() {
light[0].off();
light[1].off();
light[2].off();
light[3].off();
ac.off();
tv.off();
}
}
public class Client {
public static void main(String[] args) {
GeneralSwitchFacade gsf = new GeneralSwitchFacade();
gsf.on();
gsf.off();
}
}