zoukankan      html  css  js  c++  java
  • 常用设计模式 -- 一分钟就能学会的门面模式(外观模式)

    上次在整理日志框架的时候,发现里面用到了一个设计模式----门面模式(外观模式),找了一些资料去了解,其实非常简单,我们在开发的时候可能还经常不经意间去使用过,在这里写一下总结。

    【提示】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一

    定义

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

    UML图

    从 UML图可以看出,客户端调用的时候只需要与门面类 Facade 进行交互,并不需要知道子系统的存在,而 Facade 类则需要知道全部子系统的功能,进行具体调用。

    四个子系统类

    class SubSystemOne {
        public void MethodOne() {
            System.out.println("子系统方法一");
        }
    }
    
    class SubSystemTwo {
        public void MethodTwo() {
            System.out.println("子系统方法二");
        }
    }
    
    class SubSystemThree {
        public void MethodThree() {
            System.out.println("子系统方法三");
        }
    }
    
    class SubSystemFour {
        public void MethodFour() {
            System.out.println("子系统方法四");
        }
    }
    

    外观类

    class Facade {
        SubSystemOne one;
        SubSystemTwo two;
        SubSystemThree three;
        SubSystemFour four;
        
        public Facade() {
            one = new SubSystemOne;
            two = new SubSystemTwo;
            three = new SubSystemThree;
            four = new SubSystemFour;
        }
        
        public void MethodA() {
            System.out.println("方法组A() ---- ");
            one.MethodOne();
            two.MethodTwo();
            four.MethodFour();
        }
        
        public void MethodB() {
            System.out.println("方法组B() ---- ");
            two.MethodTwo();
            three.MethodThree();
        }
    }
    

    客户端调用

    public static void main(String[] args) {
        Facade facade = new Facade();
        //由于 Facade 的作用,客户端不需要知道子系统类的存在,只要由Facade调用就行
        facade.MathodA();
        facade.MathodB();
    }
    

    以上代码就是一个门面模式了。

    有一定面向对象基础的朋友就会说,这不就是多加了一层封装吗?

    没错,就是多加了一层封装而已,所以即使我们之前没听过外观模式,也在不经意间使用过它。


    优缺点

    优点: 它完美地体现了依赖倒转原则和迪米特法则的思想,是非常常用的设计模式之一。

    缺点: 不符合开闭原则,对修改关闭,对扩展开放。如果我们想多加一个子系统,那就只能在门面对象上修改代码;

    使用场景:

    1. 在设计初期阶段,有意识的将不同的两个层分离。比如经典的 MVC 架构,就要考虑持久层和业务层、业务层和控制层的层与层之间建立外观 Facade,使得耦合大大降低。
    2. 在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂。这时增加外观 Facade 可以提供一个简单的接口,减少它们之间的依赖。
    3. 在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但它包含非常重要的功能,新的需要开发需要依赖它。这时可以为新系统开发一个外观 Facade 类,让新系统与 Facade 对象交互,Facade 与遗留代码交互所有复杂的工作。
  • 相关阅读:
    防火墙透明模式
    HP管理工具System Management Homepage安装配置
    kbmmw 中JSON 中使用SQL 查询
    kbmmw 中JSON 操作入门
    第一个kbmmw for Linux 服务器
    kbmmw 5.02发布
    kbmmw 5.01 发布
    使用delphi 10.2 开发linux 上的Daemon
    使用unidac 在linux 上无驱动直接访问MS SQL SERVER
    使用delphi 10.2 开发linux 上的webservice
  • 原文地址:https://www.cnblogs.com/luler/p/15272105.html
Copyright © 2011-2022 走看看