文档章节

设计模式-外观模式

o
 osc_w9s1w4o0
发布于 2019/03/31 12:14
字数 845
阅读 0
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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

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

    我们先看下结构图:

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

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

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

 

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

      

      

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

SnailSVN Pro for mac(SVN客户端) v1.9.9

macw为您带来SnailSVN Pro for mac ,SnailSVN Mac版是一款类似于 TortoiseSVN 的 Apache Subversion(SVN)客户端,与 Finder 紧密集成。SnailSVN Mac版允许你从 Finder 的上下文菜单中快速...

单手绕月
16分钟前
0
0
python网络编程(进程与多线程)

multiprocessing模块   由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。   multiprocessing包是Pytho...

osc_ky74f26k
16分钟前
5
0
CentOS7 redis5.0高可用部署

概述 Redis Sentinel为Redis提供高可用性。Redis Sentinel是一个分布式系统,Sentinel本身设计为在有多个Sentinel进程协同合作的配置中运行。具有多个Sentinel进程进行协作的优点如下: 1、当...

紅顏為君笑
16分钟前
6
0
Ocelot简易教程(四)之请求聚合以及服务发现

上篇文章给大家讲解了Ocelot的一些特性并对路由进行了详细的介绍,今天呢就大家一起来学习下Ocelot的请求聚合以及服务发现功能。希望能对大家有所帮助。 作者:依乐祝 原文地址:https://www...

osc_zo0djpuu
17分钟前
8
0
leetcode63(不同路径 II)--Java语言实现

求: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在...

拓拔北海
17分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部