门面模式:
外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
结构:
门面角色(Facade):客户端可以调用这个角色的方法,由此对象知晓相关(一个或多个)子系统的功能和责任。正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
子系统角色(SubSystem):可同时有一个或多个子系统,每个子系统都不是单独的类。而是类的集合。每个系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面对象的存在。对于子系统而言,门面仅仅是另外一个客户端而已。
门面模式通常只需要一个门面类,并且只有一个实例,即它是一个单利类。每个子系统只有一个门面类,如果一个系统有好几个子系统,每个子系统有一个门面类,整个系统有多个门面类。如果子系统没有某个功能,想通过修改门面类或者继承门面类的方法来提供新功能的行为是错误的。
实例:
一个保安系统由两个录像机、三个电灯、一个遥感器和一个警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。
代码:
class Camera { public void turnOn() { System.out.println("turning on the camera."); } public void turnOff() { System.out.println("turning off the camera."); } } class Light { public void turnOn() { System.out.println("turning on the light."); } public void turnOff() { System.out.println("turning off the light."); } } class Sensor { public void activate() { System.out.println("activating the sensor."); } public void deactivate() { System.out.println("deactivating the sensor."); } } class Alarm { public void activate() { System.out.println("activating the sensor."); } public void deactivate() { System.out.println("deactivating the sensor."); } } public class FacedePattern { public static void main(String[] args) { Camera camera1 = new Camera(); Camera camera2 = new Camera(); Light light1 = new Light(); Light light2 = new Light(); Sensor sensor = new Sensor(); Alarm alarm = new Alarm(); camera1.turnOn(); camera2.turnOn(); light1.turnOn(); light2.turnOff(); sensor.activate(); alarm.activate(); } }
有些方法没有写出来。
使用门面模式:
准备一个系统的控制台,作为保安系统的用户界面。
SecurityFacade对象承担了与保安系统内部各个对象打交道的任务。客户对象只需要与门面对象交互即可。
class SecurityFacade { private Camera camera1, camera2; private Light light1, light2; private Sensor sensor; private Alarm alarm; public SecurityFacade() { camera1 = new Camera(); camera2 = new Camera(); light1 = new Light(); light2 = new Light(); sensor = new Sensor(); alarm = new Alarm(); } public void activate() { camera1.turnOn(); camera2.turnOn(); light1.turnOn(); light2.turnOff(); sensor.activate(); alarm.activate(); } public void deactivate() { camera1.turnOff(); camera2.turnOff(); light1.turnOff(); light2.turnOff(); sensor.deactivate(); alarm.deactivate(); } } public class FacedePattern { public static void main(String[] args) { SecurityFacade sf = new SecurityFacade(); sf.activate(); sf.deactivate(); } }
参考:
《Java与模式》