Skip to content
Java陈序员Java陈序员
首页
开源项目open in new window
github icon
  • 设计模式
    • 设计模式七大原则
      • UML 类图
        • 单例模式
          • 工厂模式
            • 原型模式
              • 建造者模式
                • 适配器模式
                  • 桥接模式
                    • 装饰者模式
                      • 组合模式
                        • 外观模式
                          • 1.1 应用实例
                            • 1.1.1 业务需求
                              • 1.1.2 解决方案
                                • 1.1.3 问题分析
                                • 1.2 外观模式
                                  • 1.2.1 基本介绍
                                    • 1.2.2 原理类图
                                      • 1.2.3 代码实现
                                      • 1.3 外观模式在 MyBatis 框架应用的源码分析
                                        • 1.4 外观模式的注意事项和细节
                                        • 享元模式
                                          • 代理模式
                                            • 模板方法模式
                                              • 命令模式
                                                • 访问者模式
                                                  • 迭代器模式
                                                    • 观察者模式
                                                      • 中介者模式
                                                        • 备忘录模式
                                                          • 解释器模式
                                                            • 状态模式
                                                              • 策略模式
                                                                • 责任链模式

                                                                  外观模式

                                                                  author iconJava陈序员原创💡calendar icon2022年6月21日category icon
                                                                  • 设计模式
                                                                  tag icon
                                                                  • 外观模式
                                                                  timer icon大约 4 分钟

                                                                  此页内容
                                                                  • 1.1 应用实例
                                                                    • 1.1.1 业务需求
                                                                    • 1.1.2 解决方案
                                                                    • 1.1.3 问题分析
                                                                  • 1.2 外观模式
                                                                    • 1.2.1 基本介绍
                                                                    • 1.2.2 原理类图
                                                                    • 1.2.3 代码实现
                                                                  • 1.3 外观模式在 MyBatis 框架应用的源码分析
                                                                  • 1.4 外观模式的注意事项和细节

                                                                  # 外观模式

                                                                  # 1.1 应用实例

                                                                  # 1.1.1 业务需求

                                                                  组建一个影院:有 DVD 播放器、屏幕、灯光调节等,要求完成使用影院的功能,其过程为:直接用遥控器:统筹各设备开关。

                                                                  # 1.1.2 解决方案

                                                                  image-20220621121738816

                                                                  # 1.1.3 问题分析

                                                                  1. 在 ClientTest 的 main 方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没有清晰的过程。
                                                                  2. 不利于在 ClientTest 中,去维护对子系统的操作。
                                                                  3. 解决思路:定义一个高层接口,给子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法 ready() 、 play() 、 pause() 、 end() ),用来访问子系统中的一群接口。
                                                                  4. 也就是说通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。

                                                                  # 1.2 外观模式

                                                                  # 1.2.1 基本介绍

                                                                  1. 外观模式(Facade),也叫“过程模式“:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
                                                                  2. 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。
                                                                  3. image-20220621121619945

                                                                  # 1.2.2 原理类图

                                                                  image-20220621121703871

                                                                  对类图说明(分类外观模式的角色)

                                                                  1. 外观类(Facade): 为调用端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象。
                                                                  2. 调用者(Client): 外观接口的调用者。
                                                                  3. 子系统的集合:指模块或者子系统,处理Facade 对象指派的任务,他是功能的实际提供者。

                                                                  # 1.2.3 代码实现

                                                                  1. 使用外观模式来完成影院项目

                                                                  2. 思路分析和图解(类图)

                                                                    image-20220621121834899

                                                                  3. 代码实现

                                                                    1. 创建 DVD 播放器、屏幕、灯光等类

                                                                      public class DVDPlayer {
                                                                      
                                                                          private static final DVDPlayer instance = new DVDPlayer();
                                                                      
                                                                          public static DVDPlayer getInstance() {
                                                                              return instance;
                                                                          }
                                                                      
                                                                          public void on() {
                                                                              System.out.println(" DVDPlayer on...");
                                                                          }
                                                                      
                                                                          public void off() {
                                                                              System.out.println(" DVDPlayer off...");
                                                                          }
                                                                      
                                                                          public void play() {
                                                                              System.out.println(" DVDPlayer play...");
                                                                          }
                                                                      
                                                                          public void pause() {
                                                                              System.out.println(" DVDPlayer pause...");
                                                                          }
                                                                      }
                                                                      
                                                                      1
                                                                      2
                                                                      3
                                                                      4
                                                                      5
                                                                      6
                                                                      7
                                                                      8
                                                                      9
                                                                      10
                                                                      11
                                                                      12
                                                                      13
                                                                      14
                                                                      15
                                                                      16
                                                                      17
                                                                      18
                                                                      19
                                                                      20
                                                                      21
                                                                      22
                                                                      23
                                                                      24
                                                                      public class Screen {
                                                                      
                                                                          private static final Screen instance = new Screen();
                                                                      
                                                                          public static Screen getInstance() {
                                                                              return instance;
                                                                          }
                                                                      
                                                                          public void up() {
                                                                              System.out.println(" Screen up...");
                                                                          }
                                                                      
                                                                          public void down() {
                                                                              System.out.println(" Screen down...");
                                                                          }
                                                                      
                                                                      }
                                                                      
                                                                      1
                                                                      2
                                                                      3
                                                                      4
                                                                      5
                                                                      6
                                                                      7
                                                                      8
                                                                      9
                                                                      10
                                                                      11
                                                                      12
                                                                      13
                                                                      14
                                                                      15
                                                                      16
                                                                      17
                                                                      public class Light {
                                                                      
                                                                          private static final Light instance = new Light();
                                                                      
                                                                          public static Light getInstance() {
                                                                              return instance;
                                                                          }
                                                                      
                                                                          public void brighten() {
                                                                              System.out.println(" Light brighten... ");
                                                                          }
                                                                      
                                                                          public void dimmed() {
                                                                              System.out.println(" Light dimmed... ");
                                                                          }
                                                                      }
                                                                      
                                                                      
                                                                      1
                                                                      2
                                                                      3
                                                                      4
                                                                      5
                                                                      6
                                                                      7
                                                                      8
                                                                      9
                                                                      10
                                                                      11
                                                                      12
                                                                      13
                                                                      14
                                                                      15
                                                                      16
                                                                      17
                                                                    2. 创建外观类

                                                                      public class Cinema {
                                                                      
                                                                          private DVDPlayer dvdPlayer;
                                                                      
                                                                          private Screen screen;
                                                                      
                                                                          private Light light;
                                                                      
                                                                          public Cinema() {
                                                                              dvdPlayer = DVDPlayer.getInstance();
                                                                              screen = Screen.getInstance();
                                                                              light = Light.getInstance();
                                                                          }
                                                                      
                                                                          public void ready() {
                                                                              screen.down();
                                                                              dvdPlayer.on();
                                                                              light.dimmed();
                                                                          }
                                                                      
                                                                          public void play() {
                                                                              dvdPlayer.play();
                                                                          }
                                                                      
                                                                          public void pause() {
                                                                              dvdPlayer.pause();
                                                                          }
                                                                      
                                                                          public void end() {
                                                                              dvdPlayer.off();
                                                                              screen.up();
                                                                              light.brighten();
                                                                          }
                                                                      }
                                                                      
                                                                      1
                                                                      2
                                                                      3
                                                                      4
                                                                      5
                                                                      6
                                                                      7
                                                                      8
                                                                      9
                                                                      10
                                                                      11
                                                                      12
                                                                      13
                                                                      14
                                                                      15
                                                                      16
                                                                      17
                                                                      18
                                                                      19
                                                                      20
                                                                      21
                                                                      22
                                                                      23
                                                                      24
                                                                      25
                                                                      26
                                                                      27
                                                                      28
                                                                      29
                                                                      30
                                                                      31
                                                                      32
                                                                      33
                                                                      34
                                                                    3. 创建客户端调用

                                                                      public class Client {
                                                                      
                                                                          public static void main(String[] args) {
                                                                              Cinema cinema = new Cinema();
                                                                      
                                                                              cinema.ready();
                                                                              cinema.play();
                                                                              cinema.pause();
                                                                              cinema.end();
                                                                      
                                                                              // 输出
                                                                              // Screen down...
                                                                              // DVDPlayer on...
                                                                              // Light dimmed...
                                                                              // DVDPlayer play...
                                                                              // DVDPlayer pause...
                                                                              // DVDPlayer off...
                                                                              // Screen up...
                                                                              // Light brighten...
                                                                          }
                                                                      }
                                                                      
                                                                      1
                                                                      2
                                                                      3
                                                                      4
                                                                      5
                                                                      6
                                                                      7
                                                                      8
                                                                      9
                                                                      10
                                                                      11
                                                                      12
                                                                      13
                                                                      14
                                                                      15
                                                                      16
                                                                      17
                                                                      18
                                                                      19
                                                                      20
                                                                      21

                                                                  # 1.3 外观模式在 MyBatis 框架应用的源码分析

                                                                  1. MyBatis 中的 Configuration 去创建 MetaObject 对象使用到外观模式

                                                                  2. 代码分析 + Debug 源码 + 示意图

                                                                  3. 对源码中使用到的外观模式的角色类图

                                                                    image-20220621122240983

                                                                  # 1.4 外观模式的注意事项和细节

                                                                  1. 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
                                                                  2. 外观模式对客户端与子系统的耦合关系 - 解耦,让子系统内部的模块更易维护和扩展。
                                                                  3. 通过合理的使用外观模式,可以更好的划分访问的层次。
                                                                  4. 当系统需要进行分层设计时,可以考虑使用 Facade模式。
                                                                  5. 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个 Facade类,来提供遗留系统的比较清晰简单的接口,让新系统与Facade类交互,提高复用性。
                                                                  6. 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好,要以让系统有层次,利于维护为目的。
                                                                  edit icon编辑此页open in new window
                                                                  上次编辑于: 2022/6/21 04:29:37
                                                                  贡献者: cyl
                                                                  上一页
                                                                  组合模式
                                                                  下一页
                                                                  享元模式
                                                                  没有最好,只有更好!
                                                                  Copyright © 2025 Java陈序员