zoukankan      html  css  js  c++  java
  • 外观模式(Facade)

    一、外观模式介绍

    面向对象的一个比较重要的法则:迪米特法则(最少知识原则):一个软件实体应当尽可能少的与其他实体发生相互作用。

    外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口。这个接口使得这一子系统更加容易使用。说白了,就可以理解为封装

    外观模式的核心:为子系统提供统一的入口,封装子系统的复杂性,便于客户端调用

    例1:股民炒股

    未使用外观模式情况

    要让股民尽可能少的与股票直接打交道,给其提供一个蒙面,让股民跟蒙面打交道。这样就符合了迪米特法则,让股民尽可能少的与股票打交道了。

    增加了外观模式后的类图:

    例2:客户喝茶,客户要尽可能少的与子系统(开水,茶具,茶叶...)打交道,提供一个服务员,统一了喝茶的入口。

    例3:公司注册流程

    未使用外观模式的注册流程

    使用了外观模式后呢?也就是找个代理公司来帮我们做这些事

    外观模式类结构图:

    二、外观模式代码实现

    外观模式代码实现

    未使用外观模式情况下,代码如下

    子系统代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package com.fz.facade;
     
    /**
     * 所有子系统
     */
    public class SubSystemClass {
        public void methodOne(){
            System.out.println("子系统方法1");
        }
    }
    class SubSystemClass2{
        public void methodTwo(){
            System.out.println("子系统方法2");
        }
    }
    class SubSystemClass3{
        public void methodThree(){
            System.out.println("子系统方法3");
        }
    }

    测试代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static void main(String[] args) {
        //未使用外观模式情况
        SubSystemClass s1 = new SubSystemClass();
        SubSystemClass2 s2 = new SubSystemClass2();
        SubSystemClass3 s3 = new SubSystemClass3();
        s1.methodOne();
        s2.methodTwo();
        s3.methodThree();
         
    }

    增加外观模式后:新增一个Facade类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    package com.fz.facade;
    /**
     * 外观模式:封装子系统,对外提供一个门面方法
     */
    public class Facade {
        //所有子系统的引用
        private SubSystemClass s1 = null;
        private SubSystemClass2 s2 = null;
        private SubSystemClass3 s3 = null;
        //构造子系统的引用
        public Facade() {
            this.s1 = new SubSystemClass();
            this.s2 = new SubSystemClass2();
            this.s3 = new SubSystemClass3();
        }
        /**
         * 具体的外观方法
         */
        public void facade(){
            s1.methodOne();
            s2.methodTwo();
            s3.methodThree();
        }
    }

    再次测试:

    1
    2
    3
    4
    5
    6
    public static void main(String[] args) {       
        //使用了外观模式后
        System.out.println("-----------------------");
        Facade facade = new Facade();
        facade.facade();
    }

    两次的输出结果为:

                子系统方法1

                子系统方法2

                子系统方法3

                -----------------------

                子系统方法1

                子系统方法2

                子系统方法3

    三、开发中外观模式应用场景

    其实外观模式就是我们常见的封装,在我们实际开发中,遇到的各种对子系统各模块封装的逻辑,都可以理解为外观模式

    JDBC封装后的,commons提供的DBUtils类

    Hibernate提供的工具类,Spring JDBC工具类等



    Java23种设计模式学习笔记【目录总贴】

    参考资料:

      大话设计模式(带目录完整版).pdf

      HEAD_FIRST设计模式(中文版).pdf

      尚学堂_高淇_java300集最全视频教程_【GOF23设计模式】

  • 相关阅读:
    [uoj276][清华集训2016]汽水——分数规划+点分治
    [bzoj3143][Hnoi2013]游走——动态规划+高斯消元
    TypeScript笔记八
    TypeScript笔记七
    TypeScript笔记六
    TypeScript笔记五
    TypeScript笔记四
    TypeScript笔记三
    TypeScript笔记二
    TypeScript笔记一
  • 原文地址:https://www.cnblogs.com/cxxjohnson/p/6403847.html
Copyright © 2011-2022 走看看