外观模式-提供统一入口

news2024/11/26 17:50:13

在办理流量套餐的时候,我们可以去官网查查询套餐,找出符合我们需求的套餐,然后进行办理。官网是充斥着各种各样的套餐,如果我们一个个去查看这些套餐,耗费的时间很多。而且在办理套餐的时候,步骤也比较多。而且假如有一天官网的规则或者界面改变的话,我们也不得不适应这些改变。

有个省事的办法:直接打电话给客服:”帮我办理最优惠的套餐”。这就是本文要讲的“外观模式”。

1 外观模式概述

 又称为门面模式,客户端与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口。(子系统可以是一个类、一个功能模块、系统的一个组成部分或者一个完整系统。)

外观角色将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道。

图 外观模式示意图

图 外观模式结构图

Facade,外观角色。在客户端可以调用这个角色方法,在外观角色中可以知道相关子系统的功能和职责。正常情况下,它将所有从客户端发来的请求委派到相应的子系统中去,传递给相应的子系统对象处理。

SubSystem,子系统角色。每个子系统可以不是一个单独的类,而是一个类的集合。每个子系统可以被客户端直接调用或者被外观角色调用。对于子系统而言,外观角色仅仅是另一个客户端而已。

public class MenuService {

    public void search() {
        System.out.println("查询套餐");
    }

    public void detail() {
        System.out.println("套餐详情");
    }

    public void makeOrder() {
        System.out.println("办理套餐");
    }

}


public class Facade {

    private final MenuService menuService;

    private static class ClassHolder {
        private static final Facade instance = new Facade(new MenuService());
    }

    public static Facade getInstance() {
        return ClassHolder.instance;
    }

    private Facade(MenuService menuService) {
        this.menuService = menuService;
    }

    public void makeOrder() {
        menuService.search();
        menuService.detail();
        menuService.makeOrder();
    }
}

public class Client {

    public static void main(String[] args) {
        Facade instance = Facade.getInstance();
        instance.makeOrder();
//        运行结果:
//        查询套餐
//        套餐详情
//        办理套餐
    }

}

1.1 抽象外观类

在标准的外观模式结构图中,如果需要增加、删除或更换与外观类交互的子系统,必须修改外观类或客户端源代码,这违背了开闭原则。

通过引入抽象外观类来对系统进行改进。客户端可以针对抽象外观类进行编程,对于新的业务需求,不需要修改原有外观类,而对应增加一个新的外观类。

图 抽象外观模式结构图

1.2 补充说明

1)在很多情况下,为了节约资源,系统中只需要一个外观实例,可以通过单例模式来设计外观类。

2)一个系统中可以设计多个外观类,每个外观类都复杂和一些特定的子系统交互,向客户端提供相应的业务功能。

3)试图通过外观类为子系统增加新行为的做法是错误的。

2 优缺点

优点:

  1. 对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目并使得子系统使用起来更容易。
  2. 子系统与客户端之间松耦合,子系统变化不会影响到它的客户端,只需要调整外观类即可。

缺点:

  1. 不能很好地限制客户端直接使用子系统,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
  2. 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。

3 适用场景

  1. 要为访问一些列复杂的子系统提供一个简单入口时;
  2. 客户端程序与多个子系统之间存在很大的依赖性。
  3. 在层次结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/794123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

提高公文写作效率,可以采用模板和样例来辅助写作

采用模板和样例是提高公文写作效率的一种常见方法。 模板是指已经制作好的公文格式和结构模板,可以根据模板来组织和排版自己的文章,以减少排版时间和排版错误。常见的模板包括各类公文格式,例如通知、报告、请示等等。在使用模板的过程中&am…

[MyBatis] Invalid bound statement (not found)解决方案

这个问题是由于mapper接口和mapper映射文件(xml)没有关联起来而导致的 出现这个问题请检查以下三处: 1、mapper接口所在包(package)的目录和xml映射文件所在的目录(directory)是否相同 特别要…

python的可迭代对象

一、介绍 在Python中,可迭代对象是指实现了__iter__()方法的对象,它可以通过调用iter()函数返回一个迭代器对象。可迭代对象可以是容器对象(如列表、元组、集合、字典等),也可以是自定义的对象。 二、实例 以下是一…

Security+备考我想分想这几点

考试初衷 本人是一名信息安全从业者,听过很多信息安全方面的认证,如CISP、CISSP、CISA,但是没听过Security认证,偶然的机会,我的同事给我介绍了谷安,从这里我才了解到还有Security认证这么一个信息安全认证…

【嵌入式Linux项目】基于Linux的全志H616开发板智能家居项目(语音控制、人脸识别)

目录 一、功能需求 二、开发环境 1、硬件: 2、软件: 3、引脚分配: 三、关键点 1、设计模式之工厂模式 2、wiringPi库下的相关硬件操作函数调用 3、语音模块的串口通信 4、线程 5、摄像头的实时监控和拍照功能 6、人脸识别 四、编…

4个特别使用做图标设计的软件,赶紧收藏

图标设计软件是设计师日常工作中经常使用到的设计软件之一,本文精选了4个好用的图标设计软件为大家推荐,一起来看看吧! 1、即时设计 即时设计是一款免费的,支持成员在线协作的图标设计软件,它提供了强大的设计功能和…

Kafka 入门到起飞 - Kafka怎么做到保障消息不会重复消费的? 消费者组是什么?

Kafka怎么做到避免消息重复消费的? 消费者组是什么? 消费者: 1、订阅Topic(主题) 2、从订阅的Topic消费(pull)消息, 3、将消费消息的offset(偏移量)保存在K…

Navicat 设置时间默认值(当前最新时间)

目录 前言1. 原理分析2. datetime和timestamp的区别3. 补充 前言 文章较短,但是体会很深!!!! 1. 原理分析 需求任务:填写数据的时候,如果时间不写,数据会默认用最新时间补充 一开…

Vue 本地应用 图片切换 v-show v-bind实践

点击切换图片的本质,其实修改的是img标签的src属性。 图片的地址有很多个,在js当中通过数组来保存多个数据,数组的取值结合索引,根据索引可以来判断是否是第一张还是最后一张。 图片的变化本质是src属性被修改了,属性…

【Python入门【推导式创建序列、字典推导式、集合推导式】(九)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

数学随想:轻量级算法服务。

数学随想:轻量级算法服务TOC 通常认为,数列是算法服务的基础。但是,真正用于算法服务的数列只有几个众所周知的基础数列。虽然对于不同的任务可以选择使用数列的一段用于服务,但是数列的使用还是复杂而繁重的。特别是在计算应用日…

工控机有哪些常见的硬件和软件组件?

工控机常用于制造业、自动化控制、机械设备、医疗设备、交通运输、能源管理、环境监测、安防监控等行业和领域。它们可以用于控制、监控、数据采集和处理、自动化生产线等方面。 工控机有哪些常见的硬件和软件组件? 工控机作为一种特殊的计算机设备,通…

《golang设计模式》第一部分·创建型模式-01-单例模式(Singleton)

文章目录 1. 概述1.1 目的1.2 实现方式 2. 代码示例2.1 设计2.2 代码 1. 概述 1.1 目的 保证类只有一个实例有方法能让外部访问到该实例 1.2 实现方式 懒汉式 在第一次调用单例对象时创建该对象,这样可以避免不必要的资源浪费 饿汉式 在程序启动时就创建单例对象…

你真的懂软件测试人员的痛苦吗?——目前软件测试几大误区

前言 随着软件测试对提高软件质量重要性的不断提高,软件测试也不断受到重视。但是,国内软件测试过程的不规范,重视开发和轻视测试的现象依旧存在。因此,对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识&a…

[ 容器 ] Docker 网络

目录 一、 Docker 网络实现原理二、Docker 的网络模式三、网络模式讲解1. host 模式2.container模式3.none模式4.bridge模式5.自定义网络 四、资源控制1. CPU 资源控制2 对内存使用限制3. 对磁盘IO配额控制(blkio&…

大数据技术之Hive3

目录标题 5、DML 数据操作5.1 数据导入5.1.1 向表中装载数据load5.1.2 通过查询语句向表中插入数据insert5.1.3 查询语句中创建表并加载数据5.1.4 创建表时通过 Location 指定加载数据路径 5.2 数据导出5.2.1 insert导出5.2.2 Hadoop 命令导出到本地 5.3 清除表中数据(Truncate…

剑指offer41.数据流中的中位数

我一开始的想法是既然要找中位数,那肯定要排序,而且这个数据结构肯定要能动态的添加数据的,肯定不能用数组,于是我想到了用优先队列,它自己会排序都不用我写,所以addNum方法直接调用就可以,但是…

多环境配置及配置文件位置

用端口测试了一下,properties>yml>yaml

未运行任何程序,GPU占用却很高

问题:没有运行任何程序,GPU的memory-usage占了很高,导致现在运行模型会cuda out of memory 解决:目前还未解决,希望大佬们可以给一些建议。

成为Pandas专业人士应该掌握的 30 种方法

一、说明 Pandas无疑是Python有史以来最好的库之一,用于表格数据整理和处理任务。但是,如果您是新手并试图牢牢掌握 Pandas 库,那么如果您从 Pandas 的官方文档开始,一开始事情可能会显得非常令人生畏和不知所措。 二、pandas主题…