《设计模式》外观模式

news2024/11/23 6:25:56

《设计模式》外观模式

《设计模式》设计模式的基本原则
《设计模式》单例模式
《设计模式》工厂模式
《设计模式》原型模式
《设计模式》建造者模式
《设计模式》适配器模式
《设计模式》桥接模式
《设计模式》装饰者模式
《设计模式》组合模式
《设计模式》外观模式

定义

  • 外观模式(Facade) 也叫门面模式,该模式通过定义一个高层接口,为多个复杂的子系统提供一个一致性的访问接口,而使这些子系统更加容易使用
  • 一致性的访问接口旨在屏蔽子系统的细节,使得调用方只需要调用一致性的接口,而无需关心子系统的内部细节,降低应用程序的复杂度,提高可维护性。

外观模式的主要角色

  • 外观类(Facade):为多个子系统对外提供一个共同的接口。
  • 子系统集合:处理外观类对象指派的任务,是功能的实际提供方。

外观模式的注意事项

  • 外观模式对外屏蔽了子系统的内部细节,降低了客户端对子系统的使用复杂性
  • 当系统需要进行分层设计时,可以考虑使用外观模式。
  • 当一个遗留的大型系统变得难以维护和扩展时,考虑为新系统开发一个 Facade 类,来提供遗留系统的清晰简单的接口,让新系统和 Facade 类交互,提高复用性。
  • 合理使用外观模式,可以帮助更好的划分访问层次
  • 外观模式不符合开闭原则,修改起来比较麻烦

外观模式的使用场景

  • 在对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

外观模式的原理类图如下所示

在这里插入图片描述

案例背景:

小明的爷爷每天晚上睡觉前需要使用房间里不同电器的遥控器将空调、电视机、电灯、加湿器、自动化窗帘一个个关掉,每天早上醒来还需要将这些电器自动化设备一个个打开,爷爷感觉非常麻烦,因此孝顺的小明能帮他做一个工具,能够实现一键控制,打开或者关掉房间的这些设备。

小明设计的类图如下所示

在这里插入图片描述

Client 类:

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        System.out.println("----------每天早起第一件事:打开房间内的电器------------------");
        facade.turnOn();
        System.out.println("----------每天睡前最后一件事:关闭房间内的电器----------------");
        facade.turnOff();
    }
}

Facade 类:

public class Facade {

    private AirConditioner airConditioner;
    private TV tv;
    private Light light;
    private Humidifier humidifier;

    public Facade() {
        airConditioner = new AirConditioner();
        tv = new TV();
        light = new Light();
        humidifier = new Humidifier();
    }

    public void turnOn() {
        airConditioner.turnOn();
        tv.turnOn();
        light.turnOn();
        humidifier.turnOn();
    }
    public void turnOff() {
        airConditioner.turnOff();
        tv.turnOff();
        light.turnOff();
        humidifier.turnOff();
    }
}

AirConditioner 类:

public class AirConditioner {
    public void turnOn() {
        System.out.println("打开了空调....");
    }
    public void turnOff() {
        System.out.println("关闭了空调....");
    }
}

TV 类:

public class TV {
    public void turnOn() {
        System.out.println("打开了电视....");
    }
    public void turnOff() {
        System.out.println("关闭了电视....");
    }
}

Light 类:

public class Light {
    public void turnOn() {
        System.out.println("打开了电灯....");
    }
    public void turnOff() {
        System.out.println("关闭了电灯....");
    }
}

Humidifier 类:

public class Humidifier {
    public void turnOn() {
        System.out.println("打开了加湿器....");
    }
    public void turnOff() {
        System.out.println("关闭了加湿器....");
    }
}

外观模式在 Mybatis 框架中的应用

Configuration

public class Configuration {
	//...
	public MetaObject newMetaObject(Object object) {
		return MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory, this.reflectorFactory);
	}
	//...
}

MetaObject

public class MetaObject {
    private final Object originalObject;
    private final ObjectWrapper objectWrapper;
    private final ObjectFactory objectFactory;
    private final ObjectWrapperFactory objectWrapperFactory;
    private final ReflectorFactory reflectorFactory;

    private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
        this.originalObject = object;
        this.objectFactory = objectFactory;
        this.objectWrapperFactory = objectWrapperFactory;
        this.reflectorFactory = reflectorFactory;
        if (object instanceof ObjectWrapper) {
            this.objectWrapper = (ObjectWrapper)object;
        } else if (objectWrapperFactory.hasWrapperFor(object)) {
            this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
        } else if (object instanceof Map) {
            this.objectWrapper = new MapWrapper(this, (Map)object);
        } else if (object instanceof Collection) {
            this.objectWrapper = new CollectionWrapper(this, (Collection)object);
        } else {
            this.objectWrapper = new BeanWrapper(this, object);
        }

    }

    public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
        return object == null ? SystemMetaObject.NULL_META_OBJECT : new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
    }
    //...
}

角色类图如下所示

在这里插入图片描述

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

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

相关文章

免费刷题!初级软件测试面试题目和答案这个小程序很全

有没有软件测试面试题库小程序?相信这是很多准备找工作的新手测试人都想要知道的吧! 今天,我就根据大家的需求,为大家整理了一些有关初级软件测试的面试题目以及一个可以免费刷题的题库,希望能帮助你们早日拿下心仪的…

UDS-10 Diagnostic and communication management functional unit

10 诊断与通信管理功能单元 来自:ISO 14229-1-2020.pdf 10.1概述 表22指定了诊断和通信管理功能单元。 注: DiagnosticSessionControl:客户端请求控制服务器的诊断会话。ECUReset:客户端强制服务器执行重置。SecurityAccess&am…

知识蒸馏原理

文章目录0.知识蒸馏(模型压缩的一种方法)1.蒸馏2.为什么要蒸馏3.知识的表示与迁移4.蒸馏温度T5.知识蒸馏过程6.知识蒸馏的应用场景7.知识蒸馏背后的机理8.为什么用soft targets 而不用 label smoothing?9.知识蒸馏的研究方向10.知识蒸馏代码库11.扩展阅…

回顾2022,展望2023,笔耕不辍,钟情翰墨

目录 回顾2022 博客概览 博客成就 获得测试领域优质创作者认证 获得博客专家认证 获得额外收入 创建第一个属于自己的个人社区 获得第一个实体奖牌【博客专家】 首次登榜梦想照进现实CSDN实体奖牌榜 首次参与社区新锐和社区先锋评选 开启了6个知识体系系列教程 个人…

2023春招面试:消息中间件面试题整理

RabbitMQ如何确保消息发送 ? 消息接收? 开启生产者确认机制,确保生产者的消息能到达队列(config机制保证消息正确到达交换机、return机制保证消息正确到达队列)开启持久化功能,确保消息未消费前在队列中不会…

如何通过WindowsIIS部署网站

1.winR输入control 打开【控制面板】 2.选择程序 3.选择【启用或关闭Windows功能】 4.在【Windows功能】对话框中勾选【Internet Information Services】下的【FTP服务器】、【Web管理工具】和【万维网服务】中的所有选项,并点击【确定】 5.Windows功能会开始下载并…

Lambda表达式的来龙去脉,全在这篇文章里了

一. 前言部分 大家都知道Lambda表达式作为JAVA 8中提供的新特性之一,在现在的企业开发中已经非常的流行了。今天壹哥就通过一个具体的案例,来带大家一起详细地探究一下Lambda表达式是如何被提出来的,以及它的出现主要是用来解决什么问题的。…

乌班图(Ubuntu)单系统或者乌班图+Win双系统安装教程

单ubuntu系统安装 1、将ubuntu系统U盘插入电脑USB接口,建议优先插USB3.0蓝色(彩色)接口,这样可以保证安装过程中文件的读取速度,加快安装进程。 2、然后电脑关机状态下,开机。开机后快速按主机的快捷启动键: 3、在出现…

Qt编写雷达模拟仿真工具1-背景布局

一、前言 雷达模拟仿真工具,整体结构采用的QGraphicsView框架,背景布局采用的分层绘制,这样可以控制该需要重新绘制的重新绘制,不需要重新的绘制的就没必要再多余的浪费,这里定义了一个GraphicsBackGroundItem类继承自…

Spring框架(容器)--简介(实现原理、核心模块、组成部分)

spring框架(容器) spring简介 1、Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 2、Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 3、轻量——从大小…

Creo9.0 Windows 3D建模工具

前言 creo9.0正式版是一款非常优秀的3D建模设计软件。该软件界面美观,提供了CAD 技术、模制造绘图、多实体建模、多体设计、实时仿真、框架和焊缝设计等一系列强大的辅助设计功能,通过这些功能,让用户轻松解决设计中带来的各种问题。 下载 …

律所管理系统的功能以及作用分别有哪些?

在全球进入信息化的时代,随着网络的普及与发展,网络所带来的信息交流与利用的优势愈发明显。尤其是随着法律制度的不断健全和人民法律意识的提高,涉及法律诉讼的案件也在不断地增加,律师事务所作为中介的法律机构,要处…

字符设备驱动(一)

1.Linux设备分类 linux的文件种类: -:普通文件 文件内容文件名元信息(文件的相关属性—组织在inode的一个结构体内) d:目录文件 p:管道文件 s:本地socket文件 l:链接文件 软链接&am…

4 内部类实例

内部类 内部类的分类: 成员内部类方法内部类局部内部类匿名类静态内部类 1 成员内部类 是在一个类中声明的类,包含内部类的是外围类 成员内部类的访问权限: public可以在外围类的外部使用内部类创建对象private只能在外围类的内部使用内…

提升Mac使用性能的5大方法,都非常的好用哦~

是不是发现你的 Mac 越用运行速度会越慢?没错,任何电子设备,随着使用时间的增加,都会出现不如刚买时那么流畅的问题。Mac当然也不能例外,它的运行速度会随着使用时长的递增而有所下降,所以为 Mac 提速也是十…

CSS总结(网页布局:标准流 浮动 定位)

CSS 主要的功能是布局页面,增加标签的样式和部分交互效果。 资料来源:黑马 目录 元素显示 块级元素 行内元素 行内块元素 显示模式的转换 CSS三个特点 盒子模型 传统三种布局 标准流 浮动 结合浮动和标准流可以搭建出常见的网页布局: 清除…

Java Integer.toBinaryString() 方法源码及原理解析(进制转换、位运算)

title: Java Integer.toBinaryString() 方法源码及原理解析(进制转换、位运算) date: 2022-12-27 17:31:38 tags: Java categories:Java cover: https://cover.png feature: false 1. 使用及源码概览 Integer.toBinaryString() 方法用于将十进制整数转…

【1 - 决策树 - 案例部分:泰坦尼克号幸存者预测】菜菜sklearn机器学习

课程地址:《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期:sklearn入门 & 决策树在sklearn中的实现第二期:随机森林在sklearn中的实现第三期:sklearn中的数据预处理和特征工程第四期:sklearn中的降维算法…

Spring RCE漏洞CVE-2022-22965复现与JavaFx GUI图形化漏洞利用工具开发

文章目录前言一、漏洞描述二、影响范围三、漏洞复现3.1 漏洞poc四、修复建议五、图形化工具开发-Rexbb简介与使用5.1 工具使用总结前言 换了新工作,年底了比较多自学的时间,所以把今年比较经典的漏洞给复现一下,之前因为没空,只复…

python--PyCHarm里代码整体向左/右缩进

1、PyCharm 里代码整体向左缩进 鼠标选中多行代码,同时按住 Shift Tab 键,实现一次向左缩进4个字符。 2、PyCharm 里代码整体向右缩进 鼠标选中多行代码,按下 Tab 键,实现一次向右缩进4个字符。 3、PyCharm 里光标变粗 光标…