• 结构类模式(五):外观(Facade)


    定义

    为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。

    UML

    优点

    1. 对客户屏蔽了其子系统组件,因而减少了客户处理对象的数目,并使得子系统实用起来更方便。
    2. 它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。 Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。 Facade模式还可以消除复杂的循环依赖关系,这一点在客户程序与子系统是分别实现的时候尤为重要。
    3. 如果应用需要,它并不限制它们实用子系统类。因此你可以在系统易用性和通用性之间进行选择。

    缺点

    1. 限制了客户的自由,减少了可变性。

    应用场景

    1. 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
    2. 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
    3. 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

    示例

    假设我们的项目中有一个代码生成工具,用来生成供前后端使用的代码,客户端在调用时需要先加载配置文件,然后再依次生成前后端的代码文件,这个顺序不能乱掉。我们如果直接提供每个小模块的代码给到客户端,那么当系统变得复杂时,调用会变得非常麻烦。这时如果提供一个外观类来管理所有的小模块,在给到客户端调用就会变得非常的方便了。

    Java

     1 public class Main
     2 {
     3     public static void main(String[] args)
     4     {
     5         //使用外观模式可以方便的调用来生成代码
     6         new Facade().generate();
     7     }
     8 
     9     /**
    10      * 代码生成配置类
    11      */
    12     public static class GenerateConfig
    13     {
    14         public void readConfig()
    15         {
    16             System.out.println("读取代码生成配置表");
    17         }
    18     }
    19 
    20     /**
    21      * 生成客户端代码类
    22      */
    23     public static class GenerateClientCode
    24     {
    25         public void generate()
    26         {
    27             System.out.println("生成客户端代码");
    28         }
    29     }
    30 
    31     /**
    32      * 生成服务端代码类
    33      */
    34     public static class GenerateServerCode
    35     {
    36         public void generate()
    37         {
    38             System.out.println("生成服务端代码");
    39         }
    40     }
    41 
    42     /**
    43      * 代码生成外观模式
    44      */
    45     public static class Facade
    46     {
    47         public void generate()
    48         {
    49             new GenerateConfig().readConfig();
    50             new GenerateClientCode().generate();
    51             new GenerateServerCode().generate();
    52         }
    53     }
    54 }
    View Code
  • 相关阅读:
    Spring视频学习笔记(一)
    枚举(enum)与类的静态成员(static)
    Java的继承模式
    HTML锁定Table中某一列
    Winform 中的KeyDown
    我的WebService入门
    获取键盘或鼠标多久没有对屏幕进行操作了
    从DB输出值到DataTable时,字段值为NULL时报错相关信息;
    Data层相关问题 & JS循环取值
    字符串String的trim()方法
  • 原文地址:https://www.cnblogs.com/hammerc/p/4743792.html
Copyright © 2020-2023  润新知