设计模式之(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)

大家都在看

  • django中批量插入数据

    1.什么是批量插入 在django中的orm给我们提供了一个bulk_create方法,批量创建插入数据! 2.为什么要使用批量插入 让我们首先来看看不使用大容量插入的情况: [E…

    数据库 2023年5月24日
    095
  • spring内嵌cglib包,这里藏着一个大坑

    问题发现 2022-01-21 早上 9 点,订单系统出现大面积的”系统未知错误”报错,导致部分用户无法正常下单。查询后台日志,可以看到大量的 duplic…

    数据库 2023年6月6日
    0115
  • MySQL 服务无法启动。服务没有报告任何错误。

    版本8.0.25,今天启动发现抱错,网上搜索一下发现这样可行 启动MySQL报错: 搜索了一下,按照这样步骤解决了 1.配置一下my.ini [mysqld] basedir =&…

    数据库 2023年6月16日
    096
  • AspNetCoreapi 使用 Docker + Centos 7部署

    好久没有更新文章了,前段时间写了一系列的文章放到桌面了,想着修修改改,后来系统中勒索病毒了还被公司网络安全的抓到是我电脑,后来装系统文章给装丢了。然后好长一段时间没有写了。 今天记…

    数据库 2023年6月11日
    0106
  • python-memcached学习笔记

    介绍: memcached是免费、开源、高性能、分布式内存对象的缓存系统(键/值字典),旨在通过减轻数据库负载加快动态web应用程序的使用。 数据类型:只用一种字符串类型 1:安装…

    数据库 2023年6月6日
    084
  • MySQL使用步骤

    出现mysqld: Can’t create directory ‘D:\Environment\mysql-5.7.37 \data’ (Er…

    数据库 2023年5月24日
    0154
  • Spring Boot 入门

    一、 Spring Boot 入门 1、Spring Boot 简介 简化Spring应用开发的一个框架;整个Spring技术栈的一个大整合;J2EE开发的一站式解决方案; 2、微…

    数据库 2023年6月6日
    0154
  • mysql查询上个月日期_mysql 日期查询当天,当月,上个月,当年的数据sql语句函数的使用快速解决问题

    select * from 表名 where to_days(时间字段名) = to_days(now()); SELECT * FROM 表名 WHERE TO_DAYS( NO…

    数据库 2023年6月6日
    092
  • 【转】 linux下时间格式修改为24小时制的办法(centos)

    https://blog.csdn.net/sdfadfsdf/article/details/82498935?spm=1001.2101.3001.6661.1&ut…

    数据库 2023年6月6日
    0240
  • Dubbo源码(二)-SPI源码

    假设你已经知道Dubbo SPI的使用方式,不知道的请出门左转: Dubbo源码地址: 本文使用版本:2.6.x 获取所有的拓展类 Dubbo SPI 的相关逻辑被封装在了 Ext…

    数据库 2023年6月11日
    086
  • Centos安装mysql57

    1.1 MySQL安装 1.1.1 下载 wget 命令 yum -y install wget 1.1.2 在线下载mysql安装包 wget https://dev.mysql…

    数据库 2023年5月24日
    0127
  • 2021长安杯wp

    案件背景 2021年4月25日,上午8点左右,警方接到被害人金某报案,声称自己被敲诈数万元;经询问,昨日金某被嫌疑人诱导果聊,下载了某果聊软件,导致自己的通讯录和果聊视频被嫌疑人获…

    数据库 2023年6月11日
    079
  • Java中如何遍历字符串呢?

    字符串是程序开发中我们见的最多的一种数据类型 对字符串的操作,也是我们日常涉及的最多的一种操作方式,那么如何遍历字符串为字符并输出呢? 下面笔者讲述三种操作方式,如下所示 1.直接…

    数据库 2023年6月11日
    061
  • 容器化 | 在 Rancher 中部署 MySQL 集群

    我们已经介绍了如何在 Kubernetes 和 KubeSphere 上部署 RadonDB MySQL 集群。本文将演示如何在 Rancher[1] 上部署 RadonDB My…

    数据库 2023年5月24日
    0125
  • FlyAway–数据库版本管理工具

    相关博文: FlyAway官方文档: https://flywaydb.org/documentation/getstarted/how 关于SpringBoot整合并使用FlyA…

    数据库 2023年6月6日
    070
  • Redis SCAN命令

    获取指定前缀的key 需求描述: Redis中有大量以xxx开头的key,在不使用keys命令的情况下,如何快速获取这些前缀的key 解决方案: redis自带的scan命令可以解…

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