zoukankan      html  css  js  c++  java
  • 设计模式-外观模式

        本片文章主要介绍外观模式。

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

        我们先看下结构图:

        下面我们就以这个结构图写个简单的例子:

        首先是四个子系统的代码。

    package com.lwx.facade;
    
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * User: lwx
     * Date: 2019-03-31
     * Time: 11:02
     */
    public class SubSystemOne {
    
        public void method1() {
            System.out.println("子系统方法一");
        }
    
    }
    package com.lwx.facade;
    
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * User: lwx
     * Date: 2019-03-31
     * Time: 11:03
     */
    public class SubSystemTwo {
    
        public void method2() {
            System.out.println("子系统方法二");
        }
    
    }
    package com.lwx.facade;
    
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * User: lwx
     * Date: 2019-03-31
     * Time: 11:03
     */
    public class SubSystemThree {
    
        public void method3() {
            System.out.println("子系统方法三");
        }
    
    }
    package com.lwx.facade;
    
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * User: lwx
     * Date: 2019-03-31
     * Time: 11:04
     */
    public class SubSystemFour {
    
        public void method4() {
            System.out.println("子系统方法四");
        }
    
    }

        然后是外观类,它需要了解所有的子系统的方法或属性,进行组合,以备外界调用。

    package com.lwx.facade;
    
    /**
     * Created with IntelliJ IDEA.
     * Description: 外观类
     * User: lwx
     * Date: 2019-03-31
     * Time: 11:05
     */
    public class Facade {
    
        private SubSystemOne subSystemOne;
        private SubSystemTwo subSystemTwo;
        private SubSystemThree subSystemThree;
        private SubSystemFour subSystemFour;
    
        public Facade() {
            this.subSystemOne = new SubSystemOne();
            this.subSystemTwo = new SubSystemTwo();
            this.subSystemThree = new SubSystemThree();
            this.subSystemFour = new SubSystemFour();
        }
    
        public void methodsA() {
            System.out.println("方法组A");
            subSystemOne.method1();
            subSystemTwo.method2();
            subSystemFour.method4();
        }
    
        public void methodsB() {
            System.out.println("方法组B");
            subSystemTwo.method2();
            subSystemThree.method3();
        }
    
    }

        然后我们看下测试类和运行结果。

    package com.lwx.facade;
    
    /**
     * Created with IntelliJ IDEA.
     * Description:
     * User: lwx
     * Date: 2019-03-31
     * Time: 11:07
     */
    public class FacadeTest {
    
        public static void main(String[] args) {
            Facade facade = new Facade();
            facade.methodsA();
            facade.methodsB();
        }
    
    }

        对于面向对象有一定基础的朋友,即使没有听说过外观模式,也完全有可能在很多时候使用它;比如java web开发的项目中有很多的service和dao,这一层service有一个非常重要的作用,就是为了方便我们管理项目中与业务逻辑相关的事物,service层同时也是组合dao层暴露给controller层或action层的功能;外观模式还完美地体现了依赖倒转原则和迪米特法则的思想,所以是非常常用的模式之一。

        

        总结一下外观模式的优点和缺点:

        优点:

          1.引入外观模式可以提供一个简单的借口,减少客户和子系统之间的依赖。

           2.在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,这时候如果有新系统必需依赖于它就可以为新系统开发一个外观类,来提供粗糙或高度复杂的遗留代码的比较清晰的接口,让新系统与外观类交互,外观类与遗留代码交互所有复杂工作。

        缺点:

          1.不能很好地限制客户使用子系统,如果对客户访问子系统类做太多限制减少了可变性和灵活性。

          2.在不引入外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

        最后附上demo的githup地址:https://github.com/yijinqincai/design_patterns

  • 相关阅读:
    如何快速部署Oracle Database
    有关Oracle统计信息的知识点
    索引的重建
    利用Openfiler配置基于文件系统的网络存储
    Linux命令(007) -- systemctl
    使用mysqldump导出数据库(表)
    文件处理.Windows.Fastcopy.3.50.x64.文件复制简体中文破解版(验证版)
    oracle 修改数据 保险方法
    oracle存储过程、声明变量、for循环--后期添加游标 if 、decode、 case when
    Oracle 游标使用全解
  • 原文地址:https://www.cnblogs.com/leisurexi/p/10630788.html
Copyright © 2011-2022 走看看