zoukankan      html  css  js  c++  java
  • 003-结构型-04-外观模式(Facade)

    一、概述

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

      外观模式又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口

    1.1、适用场景

      子系统越来越复杂,增加外观模式是供简单调用接口

      构建多层系统结构,利用外观对象作为每层的入口,简化层间调用

    1.2、优缺点

    优点:

    • 简化了调用过程,无需了解深入子系统,防止带来风险。
    • 减少系统依赖、松散耦合
    • 更好的划分访问层次
    • 符合迪米特法则,即最少知道原则

    缺点:

    • 增加子系统、扩展子系统行为容易引入风险
    • 不符合开闭原则

    1.3、类图角色及其职责

      

      简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。

    • 门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
    • 子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。
    • 客户角色:通过调用Facede来完成要实现的功能。

    1.4、演进过程

    示例:电脑开机进入系统,我们把他分为4步,首先打开电源,bois自检,系统引导,进入系统,4个功能是四个功能模块

    1、打开电源

    public class StartPower {
        /*
         * 打开电源
         */
        public void startPower(){
            System.out.println("电脑通电");
        }
    }

    2、BOIS自检

    public class BoisSelfTest {
        /*
         * bios自检
         */
        public void boisSelfTest(){
            System.out.println("bios自检");
        }
    }

    3、系统引导

    public class SystemGuide {
        /*
         * 系统引导
         */
        public void systemGuide(){
            System.out.println("系统引导");
        }
    }

    4、进入系统

    public class EnterSystem {
        /*
         * 进入系统
         */
        public void enterSystem(){
            System.out.println("进入系统");
        }
    }

    原来测试方式

        @Test
        public void testOrigin(){
            StartPower startPower = new StartPower();
            startPower.startPower();
    
            BoisSelfTest boisSelfTest = new BoisSelfTest();
            boisSelfTest.boisSelfTest();
    
            SystemGuide systemGuide = new SystemGuide();
            systemGuide.systemGuide();
    
            EnterSystem enterSystem = new EnterSystem();
            enterSystem.enterSystem();
        }

    输出

    电脑通电
    bios自检
    系统引导
    进入系统

    外观模式演变

    增加外观模式控制类

    public class Facade {
        private StartPower startPower = null;
        private BoisSelfTest boisSelfTest = null;
        private SystemGuide systemGuide = null;
        private EnterSystem enterSystem = null;
    
        public void startComputer(){
            startPower = new StartPower();
            boisSelfTest = new BoisSelfTest();
            systemGuide = new SystemGuide();
            enterSystem = new EnterSystem();
    
            startPower.startPower();
            boisSelfTest.boisSelfTest();
            systemGuide.systemGuide();
            enterSystem.enterSystem();
        }
    }

    测试

        @Test
        public void testFacadeClient() {
            Facade computer = new Facade();
            computer.startComputer();
        }

    二、扩展

    2.1、JDK1.7源码中的外观模式

    2.2、spring中

    org.springframework.jdbc.support.JdbcUtils

    2.3、mybatis中
    org.apache.ibatis.session.Configuration

    2.4、apache中
    org.apache.catalina.connector.RequestFacade与org.apache.catalina.connector.Request

    d

  • 相关阅读:
    gridview 鼠标经过变色函数
    两种添加数据到WEB DropDownList 控件的方法
    gridview 鼠标经过变色函数
    两种添加数据到WEB DropDownList 控件的方法
    gridview 鼠标经过变色函数
    gridview 鼠标经过变色函数
    gridview 数据绑定函数
    两种添加数据到WEB DropDownList 控件的方法
    gridview 鼠标经过变色函数
    我们的软件出了什么问题《敏捷软件开发:原则、模式与实践》(一)
  • 原文地址:https://www.cnblogs.com/bjlhx/p/11241270.html
Copyright © 2011-2022 走看看