设计模式之(12)——外观模式

外观模式(facadePattern)又叫门面模式,隐藏了子系统的复杂实现,为子系统中的一组接口提供了一个统一的访问入口,使得子系统容易被访问或使用,说白了就是把复杂的子系统封装成一个接口供给外部用户更简单地使用,这也是一种结构型设计模式。

模式结构图:

设计模式之(12)——外观模式

此模式中涉及的三种角色:

1、门面角色(Facade):外观模式的核心,被客户端调用,它知道子系统的功能,内部根据客户端角色的需求制定了几种功能组合,通过聚合的方式,持有了子系统的引用;

2、子系统角色:实现了子系统的功能,它对客户端角色和门面角色是未知的,其内部既可以有系统内的相互交互,也可以有共外界调用的接口;

3、客户端角色:通过调用Facade来完成要实现的功能;

模式举例:假如我们买了一台车,但是光买完还不够,我们还要交车船税、上车牌、买保险,之后我们才可以上路行驶,可是我们嫌这些流程太繁琐,正好4S店说可以代办这些业务,我们就可以将这些事情委托给4S店代办,这种场景我们就可以将4S店销售人员抽象为门面角色,将缴税、上车牌、买保险抽象为子系统的角色,我们自然就是客户端角色了。

示例代码如下:

package cn.com.wwh.model.facade;
/**
 *
 * @version: 1.0
 * @Description: 税务子系统
 * @author: wwh
 * @date: 2022年9月22日-下午8:05:28
 */
public class Tax {

    private static final Tax INSTANCE = new Tax();

    public static Tax getInstance() {
        return INSTANCE;
    }

    public void write() {
        System.err.println("填写资料...");
    }

    public void pay() {
        System.err.println("缴税...");
    }

    public void getInvoice() {
        System.err.println("获取发票...");
    }
}
package cn.com.wwh.model.facade;

/**
 *
 * @version: 1.0
 * @Description: 选号子系统
 * @author: wwh
 * @date: 2022年9月22日-下午7:56:38
 */
public class License {

    private static final License INSTANCE = new License();

    public static License getInstance() {
        return INSTANCE;
    }

    public void pay() {
        System.err.println("缴费...");
    }

    public void check() {
        System.err.println("验车...");
    }

    public void getLicense() {
        System.err.println("上牌结束...");
    }

}
package cn.com.wwh.model.facade;
/**
 *
 * @version: 1.0
 * @Description: 保险子系统
 * @author: wwh
 * @date: 2022年9月22日-下午7:57:56
 */
public class Insurance {

    private static final Insurance INSTANCE = new Insurance();

    public static Insurance getInstance() {
        return INSTANCE;
    }

    public void write() {
        System.err.println("填写参保信息...");
    }

    public void pay() {
        System.err.println("交钱成功...");
    }

    public void success() {
        System.err.println("参保成功...");
    }
}
package cn.com.wwh.model.facade;

/**
 *
 * @version: 1.0
 * @Description: 销售人员充当外观类角色,通过聚合的方式持有子系统的引用
 * @author: wwh
 * @date: 2022年9月22日-下午8:12:06
 */
public class Saleman {

    private License license;

    private Tax payTax;

    private Insurance insurance;

    public Saleman() {
        license = License.getInstance();
        payTax = Tax.getInstance();
        insurance = Insurance.getInstance();
    }

    // 调起税务子系统
    public void invokePayTax() {
        payTax.write();
        payTax.pay();
        payTax.getInvoice();
    }

    // 调起选号子系统
    public void invokeLicense() {
        license.pay();
        license.check();
        license.getLicense();
    }

    //调起保险子系统
    public void invokeInsurance() {
        insurance.write();
        insurance.pay();
        insurance.success();
    }

}
package cn.com.wwh.model.facade;
/**
 *
 * @version: 1.0
 * @Description: 客户端角色
 * @author: wwh
 * @date: 2022年9月22日-下午8:21:25
 */
public class Cluster {

    public static void main(String[] args) {
        Saleman saleman = new Saleman();
        saleman.invokePayTax();
        saleman.invokeLicense();
        saleman.invokeInsurance();
    }
}

UML类图:

设计模式之(12)——外观模式

使用场景:

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

2、子系统相互独立;

3、在层析结构中,可以使用外观模式定义每一层的入口,我们常使用的MVC模式也算是一种外观模式;

优点:

1、松散耦合,使得客户端和子系统之间解耦,让子系统内部的功能模块更容易扩展和维护;

2、简单易用,客户端根本不需要知道子系统的内部实现,或者根本不需要知道子系统的存在,只需要与外观类facade交互即可;

3、更好的划分层次访问,有些方法是对外的,有些方法是对内的,使用外面模式可以隐藏这些细节,或者说控制一些方法的访问;

缺点:

1、不符合开闭原则,如果要改东西很麻烦,继承重写都不合适;

2、所有的逻辑都依赖门面类,这个类出问题的话可能会影响整个系统;

总的来说,外观模式的本质是: 封装交互,简化调用。让复杂的步骤封装起来,让使用者调用更见简单,减少与子系统的交互。

好了,今天的介绍就到这,还请各位大佬批评指正,谢谢。

Original: https://www.cnblogs.com/wha6239/p/16719975.html
Author: 一只烤鸭朝北走
Title: 设计模式之(12)——外观模式

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

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

(0)

大家都在看

  • Consul 入门-运行

    HashiCorp Consul 是由 HashiCorp 公司开发的,它是一家专注于 DevOps 工具链的公司,旗下的明星级产品包括 Vagrant、Terraform、Vau…

    数据库 2023年6月6日
    069
  • 部署tomcat

    tomcat tomcat 一、tomcat是什么 二、tomcat部署 1.实现访问java测试网页 2.能够成功登录到tomcat首页中的host manager、server…

    数据库 2023年6月14日
    044
  • RadonDB MySQL on K8s 2.1.3 发布!

    RadonDB MySQL Kubernetes 于 3 月 24 日正式发布新版本 2.1.3 。该版本主要基于在 2.1.2 进行功能优化和升级。 首先感谢 @andyli02…

    数据库 2023年5月24日
    083
  • MongoDB,入门看这一篇足矣!

    一、介绍 在介绍 MongoDB 之前,我先介绍一下业务开发的时候遇到的痛点,以便大家对它有一个更加清晰的认识! 最近在用数据库存储数据的时候发现这么一个坑,例如从消息队列中监听消…

    数据库 2023年6月14日
    075
  • RadonDB MySQL Kubernetes 2.2.0 发布!

    摘要 RadonDB MySQL Kubernetes v2.2.0 于近日发布!该版本开始支持 MySQL 8.0,备份功能优化,并全面提升高可用稳定性。社区同步发起&#8221…

    数据库 2023年5月24日
    095
  • 图像处理

    绘制图像绘图类 不仅可以绘制几何图形, 还可以绘制图像,绘制图像需要使用 drawImage()方法 ,该方法用来将图像资源显示到绘图上下文中。drawImage()方法 语法: …

    数据库 2023年6月16日
    083
  • Oracle备份与还原(实用版)

    Oracle备份与还原 EXP和IMP是客户端工…

    数据库 2023年6月16日
    090
  • 第16章 变量、流程控制与游标

    第16章 变量、流程控制与游标 1. 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。 在 MySQL 数据库中,变…

    数据库 2023年6月6日
    083
  • Html转换PDF(Java实用版)

    前言: 在工作当中,遇到了需要把HTML页面转化为PDF文档,有很多中实现,如下进行一个对比,大家个借鉴去进行使用 各实现对比表 于Windows平台进行测试: 此博客仅基于ITe…

    数据库 2023年6月16日
    0106
  • Mysql数据库 ALTER 基本操作

    背景: ALTER作为DDL语言之一,工作中经常遇到,这里我们简单介绍一下常见的几种使用场景 新建两个测试表offices 和 employess CREATE TABLE off…

    数据库 2023年6月14日
    072
  • 【StoneDB研发日志】union功能bug记录

    1、问题现象 create database syw_mtr; use syw_mtr; CREATE TABLE t1 (f1 VARCHAR(255) CHARACTER SE…

    数据库 2023年5月24日
    074
  • ansible碎碎念

    Using a SSH password instead of a key is not possible because Host Key checking is enabled…

    数据库 2023年6月11日
    063
  • springboot~用正则表达式提取bearer token

    前后一体的应用,是这样进行认证的 用户向服务端发送验证信息(用户名、密码); 服务端验证成功就向用户返回一个sessionid; 服务端保存了这个session_id对应的信息,并…

    数据库 2023年6月6日
    088
  • mysql 事务 隔离性 锁

    1、四大特性 1.1 原子性(Atomicity) 事务是一个不可分割的最小工作单元。事务是一个不可分割的最小工作单元。 [En] A transaction is an indi…

    数据库 2023年5月24日
    071
  • String vs StringBuffer vs StringBuilder

    String vs StringBuffer vs StringBuilder 本文翻译自:https://www.digitalocean.com/community/tutor…

    数据库 2023年6月11日
    088
  • CentOS7源码安装Python、virtualenv虚拟环境安装、uwsgi安装配置

    一:Python源码安装 1:Python源码下载XZ开头的 https://www.python.org/downloads/source/ 2:解压:tar xf Python…

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