外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。简言之,客户端只需创建外观对象,调用外观对象的方法即可。外观模式又称门面模式。

我们以智能音箱为例,我们借助智能音箱来控制电视,灯和空调的打开和关闭。
创建一个接口,定义电器的开启和关闭
public interface Device {void on();void off();}
创建实现接口的实体类 ```java public class Light implements Device {
@Override public void on() { System.out.println(“开灯”); }
@Override public void off() { System.out.println(“关灯”); } }
public class TV implements Device {
@Override public void on() { System.out.println(“开电视”); }
@Override public void off() { System.out.println(“关电视”); } }
public class AirCondition implements Device {
@Override public void on() { System.out.println(“开空调”); }
@Override public void off() { System.out.println(“关空调”); } }
3. 创建一个外观类```javapublic class SmartFacade {//聚合灯对象,tv对象,空调对象private Device light;private Device tv;private Device airCondition;public SmartFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}public void onLight(){light.on();}public void offLight(){light.off();}public void onTV(){tv.on();}public void offTV(){tv.off();}public void offAirCondition(){airCondition.on();}public void offAirCondition(){airCondition.off();}}
- 使用该外观类来操作具体的电器
public class FacadePatternDemo {public static void main(String[] args) {SmartFacade smartFacade = new SmartFacade();smartFacade.onlight();}}
外观模式的应用
Tomcat调用HttpServlet#doGet的时候,传递的req其实是RequestFacade的类对象。RequestFacade是HttpServletRequest的实现类,同时持有Request对象,并设置为私有。避免将Request的所有信息呈现给用户。
public abstract class HttpServlet extends GenericServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp);}
