门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面对(Facade)象进行。
迪米特法则:只与你直接的朋友们通信。
此设计模式需要一个设计不是很好的系统进行改造来进行对比Facade倒底做些什么。
以下为一个设计不是很好的系统:
可以看出,Client对象需要引用到所有的Camera,Light,Sensor,Alarm对象。Client必须对保安系统全知全能,这是一个不利于复用的做法,源代码如下所示:
//Client.java
package com.javapatterns.facade.security;
public class Client
{
static private Camera camera1 = new Camera();
static private Camera camera2 = new Camera();
static private Light light1 = new Light();
static private Light light2 = new Light();
static private Light light3 = new Light();
static private Sensor sensor = new Sensor();
static private Alarm alarm = new Alarm();
public static void main(String[] args)
{
camera1.turnOn();
camera2.turnOn();
light1.turnOn();
light2.turnOn();
light3.turnOn();
sensor.activate();
alarm.activate();
}
}
//Camera.java
package com.javapatterns.facade.security;
public class Camera
{
public void turnOn()
{
System.out.println("Turning on the camera.");
}
public void turnOff()
{
System.out.println("Turning off the camera.");
}
public void rotate(int degrees)
{
System.out.println("rotating the camera by " + degrees + " degrees.");
}
}
//Light.java
package com.javapatterns.facade.security;
public class Light
{
public void turnOn()
{
System.out.println("Turning on the Light.");
}
public void turnOff()
{
System.out.println("Turning off the Light.");
}
public void changeBulb()
{
System.out.println("changing the light-bulb.");
}
}
//Sensor.java
package com.javapatterns.facade.security;
public class Sensor
{
public void activate()
{
System.out.println("Activating the sensor.");
}
public void deactivate()
{
System.out.println("Deactivating the sensor.");
}
public void trigger()
{
System.out.println("The sensor has been triggered.");
}
}
//Alarm.java
package com.javapatterns.facade.security;
public class Alarm
{
public void activate()
{
System.out.println("Activating the alarm.");
}
public void deactivate()
{
System.out.println("Deactivating the alarm.");
}
public void ring()
{
System.out.println("Ringing the alarm.");
}
public void stopRing()
{
System.out.println("Ringing stopped.");
}
}