下面是正文
外观模式
外观模式定义了一个将子系统的一组接口集中在一起的高层接口,以提供一个一致的界面。通过这个界面,客户端可以很方便的调用子系统的功能,而忽略子系统内部发生的变化。
优点
降低了子系统和客户的耦合度
例子
这里我们以智能家居回家、出门场景为例,子系统有:开灯、打开电视、打开空调。那么就将其回家、出门的这个场景作为门面,我们(客户端)只需要对场景操作,不需要了解子系统发生的变化。(例子如有不对,敬请指教)
智能灯 — 子系统
/**
* 电灯 子系统
*
* 有开关灯操作
* */
public class LightSubsystem {
//开灯
public void turnOnTheLight(){
System.out.println("电灯已经打开!");
}
//关灯
public void turnOffTheLight(){
System.out.println("电灯已经关闭!");
}
}
电视子系统
/**
* 电视子系统
*
* 打开、关闭电视
* */
public class TvSubsystem {
//打开
public void turnOnTheTv(){
System.out.println("电视已经打开");
}
//关闭
public void turnOffTheTv(){
System.out.println("电视已经打开");
}
}
空调—子系统
/**
* 空调子系统
*
* 打开空调,调节温度
*
* 关闭空调
* */
public class AirconditioningSubsystem {
//打开空调,调节温度
public void turnOnTheAC(){
System.out.println("空调已经打开,温度设置为28℃");
}
//关闭空调
public void turnOffTheAC(){
System.out.println("空调已经关闭");
}
}
场景门面模式
/**
* 门面类
*
* 提供回家、出门场景方案
*
* 将子系统的方法集中在这个门面类中
* */
public class SceneFacade {
private LightSubsystem lightSubsystem = null;
private TvSubsystem tvSubsystem = null;
private AirconditioningSubsystem airconditioningSubsystem = null;
public SceneFacade(){
this.lightSubsystem = new LightSubsystem();
this.tvSubsystem = new TvSubsystem();
this.airconditioningSubsystem = new AirconditioningSubsystem();
}
//回家
public void goHome(){
System.out.println("------------回家------------");
this.lightSubsystem.turnOnTheLight();
this.tvSubsystem.turnOnTheTv();
this.airconditioningSubsystem.turnOnTheAC();
}
//出门
public void goOut(){
System.out.println("------------出门------------");
this.lightSubsystem.turnOffTheLight();
this.tvSubsystem.turnOffTheTv();
this.airconditioningSubsystem.turnOffTheAC();
}
}
主入口
/**
* 门面模式主入口类
*
* 这里我们以智能家居回家、出门场景为例
* 子系统有:开灯、打开电视、打开空调
* */
public class FacadePatternMain {
public static void main(String[] args){
SceneFacade sceneFacade = new SceneFacade();
//回家
sceneFacade.goHome();
//出门
sceneFacade.goOut();
}
}
在这个模式里,我们只需要出现回家、出去的场景,场景这个门面就可以执行子系统的相关方法,而我们不必了解子系统的内部实现。只需要控制场景这一门面即可。
输出
[Java]
设计模式源码