所谓外观模式就是要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行交互。外观模式提供一个高层次的接口使得子系统更易于使用。
相关角色:
1.外观(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的子系统的功能和责任。
2.子系统角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被外观角色调用。
适用情况:
1.为复杂的子系统提供一个简单的接口;
2.客户程序与抽象类的实现部分之间存在着很大的依赖性;
3.构建一个层次结构的子系统时,适用外观模式定义子系统中每层的入口点。
外观模式的简单实现:
代码:
Camara.java
package facade; public class Camara { public void turnOn() { System.out.println("开启摄像头!"); } public void turnOff() { System.out.println("关闭摄像头!"); } }
Light.java
package facade; public class Light { public void turnOn() { System.out.println("开灯!"); } public void turnOff() { System.out.println("关灯!"); } }
Sensor.java
package facade; public class Sensor { public void activate() { System.out.println("开启感应器!"); } public void deactivate() { System.out.println("关闭感应器!"); } }
MyFacade.java
package facade; public class MyFacade { private static Camara c1, c2; private static Light l1, l2, l3; private static Sensor s; static { c1 = new Camara(); c2 = new Camara(); l1 = new Light(); l2 = new Light(); l3 = new Light(); s = new Sensor(); } public static void activate() { c1.turnOn(); c2.turnOn(); l1.turnOn(); l2.turnOn(); l3.turnOn(); s.activate(); } public static void deactivate() { c1.turnOff(); c2.turnOff(); l1.turnOff(); l2.turnOff(); l3.turnOff(); s.deactivate(); } }
ClientTest.java
package facade; public class ClientTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //打开 MyFacade.activate(); //关闭 MyFacade.deactivate(); } }