设计模式-外观模式

Posted yijinqincai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-外观模式相关的知识,希望对你有一定的参考价值。

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

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

    我们先看下结构图:

技术图片

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

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

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

 

    作者:一金芹菜
    本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

      

      

以上是关于设计模式-外观模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之外观模式

2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用

外观模式(Facade Pattern)

外观模式

设计模式:外观(Facade)模式

学习设计模式之外观模式