1.外观模式又叫做门面模式,主要是为子系统中的一组接口提供一个一致的界面, Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
2.【GOF】的书中指出:在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只能有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统有一个门面类,整个系统可以有数个门面类。
3.示意图:
4.例子:
package com.facade;
public class RoomLight {
public void start(){
System.out.println("房间的灯开了");
}
public void close(){
System.out.println("房间的灯关了");
}
}
package com.facade;
public class KitchenLight {
public void start(){
System.out.println("厨房的灯开了");
}
public void close(){
System.out.println("厨房的灯关了");
}
}
package com.facade;
public interface Facade {
void startRootLight();
void closeRootLight();
void startKitchenLight();
void closeKitchenLight();
}
package com.facade;
public class LightFacade implements Facade{
private static LightFacade f = new LightFacade();
private RoomLight rootLight;
private KitchenLight kitchenLight;
private LightFacade(){
rootLight = new RoomLight();
kitchenLight = new KitchenLight();
}
public static LightFacade getLightFacade(){
return f;
}
public void closeKitchenLight() {
kitchenLight.close();
}
public void closeRootLight() {
rootLight.close();
}
public void startKitchenLight() {
kitchenLight.start();
}
public void startRootLight() {
rootLight.start();
}
}
package com.facade;
public class Client {
public static void main(String[] args){
//控制它们时还要各个new一下
/*
KitchenLight k = new KitchenLight();
RoomLight r = new RoomLight();
k.start();
r.start();
k.close();
r.close();
*/
//做一个控制面板
LightFacade f = LightFacade.getLightFacade();
f.startKitchenLight();
f.startRootLight();
f.closeKitchenLight();
f.closeRootLight();
}
}