zoukankan      html  css  js  c++  java
  • 10,外观模式

    一,概念

    Facade模式也叫外观模式,是由GoF提出的23种设计模式中的一种。Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。

    二,例子

    结构

    三个要素

    子系统角色(Subsystem classes):功能提供者。指提供功能的类群(模块或子系统)。

    外观角色(Facade):为调用方定义简单的调用接口。是模式的核心,他被客户client角色调用,知道各个子系统的功能。同时根据客户角色已有的需求预订了几种功能组合。

    客户角色(Clients):调用者。通过Facade接口调用提供某功能的内部类群。

    子系统角色(Subsystem classes):SystemA,SystemB,SystemC

    /**
     * 
     * @类名称:SystemA
     * @类描述:子系统角色(Subsystem classes)
     * @创建人:zender
     */
    public class SystemA {
        /*
         * A子系统实现功能
         */
        public void doSomething() {
            System.out.println("实现A子系统功能");
        }
    }
    /**
     * 
     * @类名称:SystemB
     * @类描述:子系统角色(Subsystem classes)
     * @创建人:zender
     */
    public class SystemB {
        /*
         * B子系统实现功能
         */
        public void doSomething() {
            System.out.println("实现B子系统功能");
        }
    }
    /**
     * 
     * @类名称:SystemC
     * @类描述:子系统角色(Subsystem classes)
     * @创建人:zender
     */
    public class SystemC {
        /*
         * C子系统实现功能
         */
        public void doSomething() {
            System.out.println("实现C子系统功能");
        }
    }

    外观角色(Facade):SystemFacade

    /**
     * 
     * @类名称:SystemFacade
     * @类描述:外观角色(Facade)
     * @创建人:zender
     */
    public class SystemFacade {
        private SystemA systemA;
        private SystemB systemB;
        private SystemC systemC;
        
        public SystemFacade() {
            this.systemA = new SystemA();
            this.systemB = new SystemB();
            this.systemC = new SystemC();
        }
        
        public void doABC() {
            this.systemA.doSomething();
            this.systemB.doSomething();
            this.systemC.doSomething();
        }
        
        public void doAB() {
            this.systemA.doSomething();
            this.systemB.doSomething();
        }
    }

    客户角色(Clients):SystenClients

    /**
     * 
     * @类名称:SystenClients
     * @类描述:客户角色(Clients)
     * @创建人:zender
     */
    public class SystenClients {
        public static void main(String[] args) {
            // 由于Facade的作用,客户端可以根本不知道子系统类的存在
            SystemFacade sf = new SystemFacade();
            sf.doABC();
            System.out.println("....................");
            sf.doAB();
        }
    }

    结果

    三、优点缺点

    1,优点

    Facade模式降低了客户端对子系统使用的复杂性。

    外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

    通过合理使用Facade,可以帮助我们更好的划分访问的层次。

    2,缺点

       过多的或者是不太合理的Facade也容易让人迷惑,到底是调用Facade好呢,还是直接调用模块好。

    四,适用场景

    1,需要将设计进行分层时考虑Facade模式。

    2,在开发阶段,子系统往往因为重构变得越来越复杂,增加外观模式可以提供一个简单的接口,减少它们之间的依赖。

    3,在维护一个遗留的大型系统时,可以这个系统已经非常难以维护和扩展,可以为新系统开发一个Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

  • 相关阅读:
    scrapy xpath 定位节点获取数据
    pandas 获取增量数据
    10秒解决80端口被占用
    VS code 自定义快捷键
    解决npm 的 shasum check failed for错误
    JSON.parse与eval的区别
    display:flex,用这个布局就像开挂了!!!
    几款前端IDE工具:Sublime、Atom、VSCode比较
    npm install -S -D -g 有什么区别
    Vue框架学习——使用nvm下载8.12.0以后版本没有npm文件的解决办法
  • 原文地址:https://www.cnblogs.com/Zender/p/7503710.html
Copyright © 2011-2022 走看看