设计模式 11 外观模式

外观模式(Facade Pattern)属于 结构型模式

在生活中,经常遇到这样的情况:办理一个业务,需要找很多部门签字盖章,这些部门往往距离较远,无奈只得四处奔波。这时候相信所有人都有一个同样的诉求:要是找一个部门就能办理完所有业务就好了!

编程来源于生活,生活中是这样,代码中也是这样。如果一个业务逻辑需要调几个独立的系统,不仅编写复杂,还不方便管理和维护,任意系统的业务变更都将影响很多地方。这时也是同样的诉求,要是调一个系统就能解决业务就好了!

这时 外观模式就应运而生了,它隐藏了各系统间调用的复杂性,并向客户端提供了可以一次访问就实现各系统间逻辑的接口。

外观模式充分体现了 迪米特法则。一般大型项目都有很多个子系统,可以在这些子系统的上面加一个门面(Facade),当外部需要与各个子系统交互时,无需再去单独调用各个子系统,而是直接与门面进行交互,再由门面与后面的各个子系统操作。这样方便了调用方代码的编写,统一找门面就行,不需要去详细了解各个子系统,并且,当子系统需要修改时,只需修改门面中的逻辑,不需要变动调用方的代码,遵循迪米特法则尽可能少的交互,极大的提高了便利性和健壮性。

这里以找各个部门办理业务为例介绍外观模式:

1、定义A部门

/**
 * A部门
 */
public class DepartmentA {

    /**
     * 办理业务
     */
    public void business() {
        System.out.println("A部门办理了业务");
    }

}

2、定义B部门

/**
 * B部门
 */
public class DepartmentB {

    /**
     * 办理业务
     */
    public void business() {
        System.out.println("B部门办理了业务");
    }

}

3、定义C部门

/**
 * C部门
 */
public class DepartmentC {

    /**
     * 办理业务
     */
    public void business() {
        System.out.println("C部门办理了业务");
    }

}

4、定义外观部门

/**
 * 外观部门
 */
public class Facade {

    /**
     * A部门
     */
    private DepartmentA departmentA;

    /**
     * B部门
     */
    private DepartmentB departmentB;

    /**
     * C部门
     */
    private DepartmentC departmentC;

    /**
     * 无参构造器中给包装的部门赋值
     */
    public Facade() {

        departmentA = new DepartmentA();
        departmentB = new DepartmentB();
        departmentC = new DepartmentC();
    }

    /**
     * 办理业务
     */
    public void business() {

        departmentA.business();
        departmentB.business();
        departmentC.business();
    }

}

5、调用

// 找到外观部门
Facade facade = new Facade();
// 办理业务
facade.business();

输出结果:

A部门办理了业务
B部门办理了业务
C部门办理了业务

如此即实现了找一个部门就办理了多个部门的业务。不管多复杂的业务,麻烦的都是外观部门,而不是办理业务的人。哪个部门的业务发生变化了,外观部门去跟它们沟通协调做相应调整就行,办理业务的人不用再熟悉调整后的业务,还像往常一样找外观部门办理即可。

这就是外观模式带来的巨大便利, 希望现实生活中如此场景的外观模式也早日到来!

1、减少系统相互依赖。

2、提高灵活性。

3、提高了安全性。

不符合开闭原则,如果要改东西很复杂,继承重写都不合适。

1、为复杂的模块或子系统提供外界访问的模块。

2、子系统相对独立。

3、预防低水平人员带来的风险。

在层次化结构中,可以使用外观模式定义系统中每一层的入口。

Original: https://www.cnblogs.com/codesail/p/16578156.html
Author: 程序航
Title: 设计模式 11 外观模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575058/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • K均值算法

    一、概念 K-means中心思想:事先确定常数K,常数K意味着最终的聚类类别数,首先随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相…

    Java 2023年6月7日
    0121
  • IO(finally关键字的特点及作用)

    finally的特点 finally:被finally控制的语句体一定会执行* 注意:如果在执行到finally之前jvm退出了,就不能执行了。** A:格式* try&#8230…

    Java 2023年6月5日
    074
  • C语言-字符串函数的实现(三)之strcat

    C语言中的字符串函数有如下这些 获取字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strnc…

    Java 2023年6月10日
    076
  • 基于UML软件建模的高校新闻管理系统

    前言 近年来,伴随着我国国内的网络技术快速发展。高校校园网络建设逐渐迅速发展起来,逐步演变为高校的一个宣传窗口。建立自己的高校新闻发布管理系统已经成为了一种趋势。传统的校园新闻往往…

    Java 2023年6月5日
    094
  • 一起来学习Android自定义控件2-简单的写字板控件

    概述 上一篇文章我们对自定义控件进行了一个大体的知识介绍。今天就来学习自定义一个简单的写字板控件。 先来看看效果图 就是简单的根据手指写下的轨迹去画出内容 实现 在上一篇文章里提到…

    Java 2023年6月13日
    084
  • Java开发笔记(一百三十七)JavaFX的标签

    前面介绍了JavaFX的窗口框架,其中舞台、场景、窗格都能与AWT/Swing体系的相关概念一一对应,不仅如此,JavaFX的常见控件也能在Swing中找到相应的控件。比如Java…

    Java 2023年6月6日
    073
  • Python实践项目2

    #南昌理工学院人工智能学院实验室WORKSHOP实践项目 import time import random SCRIPT_NPC_SCHOOL_SISTER = [‘你好!’, …

    Java 2023年6月9日
    064
  • 集群

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 集群(cluster)就是一组计算机,它们作为一个总体向用户提供一组网络资源…

    Java 2023年6月16日
    090
  • Hexo博客系列(三)-将Hexo v3.x个人博客发布到GitLab Pages

    【原文链接】:https://blog.tecchen.xyz ,博文同步发布到博客园。由于精力有限,对文章的更新可能不能及时同步,请点击上面的原文链接访问最新内容。欢迎访问我的个…

    Java 2023年6月6日
    0103
  • 简单的python爬虫保存百度、360 搜索内容到数据库

    import requests import re from pyquery import PyQuery as Pq import pymysql.cursors connect…

    Java 2023年6月16日
    088
  • 数据结构变化可视化网站

    数据结构变化可视化网站 支持的数据结构: 示例(B树): posted @2022-05-01 12:52 daheww 阅读(35 ) 评论() 编辑 Original: htt…

    Java 2023年6月6日
    082
  • 22.1.9 链表

    22.1.9 链表 1)哈希表在使用层面上可以理解为一种集合结构 2)如果只有key,没有伴随数据value,可以使用HashSet结构(C++中叫UnOrderedSet) 3)…

    Java 2023年6月13日
    062
  • springboot源码分析——自动配置流程

    一:ConfigurationClassPostProcessor类的埋点 自动配置解析的核心功能都在这个类里面,这是一个BeanDefinitionRegistryPostPro…

    Java 2023年5月30日
    075
  • RocketMQ保姆级教程

    大家好,我是三友~~ 上周花了一点时间从头到尾、从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家。 整篇文章可以大致分为三个部分,第一部分属…

    Java 2023年6月16日
    081
  • 一些自用的可能用到的网站资料

    maven的卸载、重新安装与配置:https://www.cnblogs.com/helong-123/p/15903756.html posted @2022-04-06 14:…

    Java 2023年6月5日
    080
  • 医院信息平台管理(医院信息集成平台)—— 概念扫盲

    引子 以患者电子病历的信息采集、存储和集中管理为基础,连接临床信息系统和管理信息系统的医疗信息共享和业务协作平台,是在区域范围支持实现以患者为中心的跨机构医疗信息共享和业务协同服务…

    Java 2023年5月29日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球