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

    7、外观模式 - 图1

    我们以智能音箱为例,我们借助智能音箱来控制电视,灯和空调的打开和关闭。

    1. 创建一个接口,定义电器的开启和关闭

      1. public interface Device {
      2. void on();
      3. void off();
      4. }
    2. 创建实现接口的实体类 ```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(“关空调”); } }

    1. 3. 创建一个外观类
    2. ```java
    3. public class SmartFacade {
    4. //聚合灯对象,tv对象,空调对象
    5. private Device light;
    6. private Device tv;
    7. private Device airCondition;
    8. public SmartFacade() {
    9. light = new Light();
    10. tv = new TV();
    11. airCondition = new AirCondition();
    12. }
    13. public void onLight(){
    14. light.on();
    15. }
    16. public void offLight(){
    17. light.off();
    18. }
    19. public void onTV(){
    20. tv.on();
    21. }
    22. public void offTV(){
    23. tv.off();
    24. }
    25. public void offAirCondition(){
    26. airCondition.on();
    27. }
    28. public void offAirCondition(){
    29. airCondition.off();
    30. }
    31. }
    1. 使用该外观类来操作具体的电器
      1. public class FacadePatternDemo {
      2. public static void main(String[] args) {
      3. SmartFacade smartFacade = new SmartFacade();
      4. smartFacade.onlight();
      5. }
      6. }

    外观模式的应用
    Tomcat调用HttpServlet#doGet的时候,传递的req其实是RequestFacade的类对象。RequestFacadeHttpServletRequest的实现类,同时持有Request对象,并设置为私有。避免将Request的所有信息呈现给用户。

    1. public abstract class HttpServlet extends GenericServlet {
    2. protected void doGet(HttpServletRequest req, HttpServletResponse resp);
    3. }