Java设计模式中外观模式是什么/外观模式有什么用,如何实现

news2024/11/18 3:31:35

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!

5.6 外观模式

5.6.1 概述

  • 又称门面模式,通过为多个子系统提供一个一致接口,而使这些子系统更加容易被访问的模式
  • 对外有一个统一接口,外部应用程序不用关心内部细节
  • 是“迪米特法则”典型应用

5.6.2 结构

  • 外观(Facade)角色:为多个子系统对外提供共同接口
  • 子系统(Sub System)角色:实现系统弄部分功能,客户接通过外观角色访问

5.6.3 案例(电器)

  • 子系统
public class AirCondition {  
    public void on(){  
        System.out.println("空调已打开。");  
    }  
    public void off(){  
        System.out.println("空调已关闭。");  
    }  
}
public class Light {  
    public void on(){  
        System.out.println("电灯已打开。");  
    }  
    public void off(){  
        System.out.println("电灯已关闭。");  
    }  
}
public class TV {  
    public void on(){  
        System.out.println("电视已打开。");  
    }  
    public void off(){  
        System.out.println("电视已关闭。");  
    }  
}
  • 外观角色
public class SmartApplicationFacade {  
    private Light light;  
    private TV tv;  
    private AirCondition airCondition;  
    public SmartApplicationFacade() {  
        this.light = new Light();  
        this.tv = new TV();  
        this.airCondition = new AirCondition();  
    }  
//    语音控制  
    public void say(String message) {  
        if (message.contains("打开"))  
            on();  
        else if (message.contains("关闭"))  
            off();  
        else System.out.println("我听不懂!");  
    }  
    //    一键打开功能  
    private void on(){  
        light.on();  
        tv.on();  
        airCondition.on();  
    }  
    //    一键关闭功能  
    private void off(){  
        light.off();  
        tv.off();  
        airCondition.off();  
    }  
}
  • 测试
public static void main(String[] args) {  
    SmartApplicationFacade smartApplicationFacade = new SmartApplicationFacade();  
    smartApplicationFacade.say("打开电器");  
    smartApplicationFacade.say("关闭电器");  
}
  • 结果![[Pasted image 20230104175416.png]]

5.6.4 优缺点

5.6.4.1 优点

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易

5.6.4.2 缺点

  • 不符合开闭原则,修改很麻烦

5.6.5 使用场景

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

5.7.5 源码解析

Tomcat作为Web容器时,接收浏览器发送的请求,Tomcat将请求信息封装成ServletRequest对象,ServletRequest是一个接口,还有子接口HttpServletRequest,request对象也是HttpServletRequest对象的子实现类对象,即RequestFacade类对象。类图如下
![[Pasted image 20230104213628.png]]
使用原因:
定义RequestFacade类,分别实现ServletRequest,同时定义私有变量Request,且方法实现调用Request的实现,再将RequestFacade转为ServletRequest传给servlet的service方法。这样即使在servlet中被下转为RequestFacade,也不能访问私有成员变量对象中方法。既使用了Request,又能防止其中方法不被合理访问。

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

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

相关文章

SAP工作流规则

代理人规则获取部分,灵活工作流和传统工作流一致 1. 事务代码:PFAC,用来创建规则 2. 规则用来确定代理,可通过如下下拉框中多种方式确定代理人 责任可在事务代码OOCU_RESP中配置代理人,可用来代替配置表确定代理人的…

Python蓝桥杯训练:数组和字符串 Ⅴ

Python蓝桥杯训练:数组和字符串 Ⅴ 文章目录Python蓝桥杯训练:数组和字符串 Ⅴ一、找到数组的中间位置二、使用最小花费爬楼梯一、找到数组的中间位置 给你一个下标从 0 开始的整数数组 nums ,请你找到 最左边 的中间位置 middleIndex &#…

推荐系统实战5——EasyRec 在DSSM召回模型中添加负采样构建CTR点击平台

推荐系统实战5——EasyRec 在DSSM召回模型中添加负采样构建CTR点击平台学习前言EasyRec仓库地址DSSM实现思路一、DSSM整体结构解析二、网络结构解析1、Embedding层的构建2、网络层的构建3、相似度计算三、训练部分解析训练自己的DSSM模型一、数据集的准备二、Config配置文件的设…

一键生成分享链接的贺卡制作工具

不用自己动手设计,在线模板帮你轻松搞定新春贺卡设计,免下载的设计工具。跟着小编的设计教程,教你如何使用乔拓云工具,在线搞定你的新春祝福贺卡设计,不用任何设计经验,只需要跟着教程就能搞定的专属贺卡设…

论文笔记:RCLane: Relay Chain Prediction for Lane Detection

RCLane: Relay Chain Prediction for Lane Detection笔记摘要动机模型结构方法其他模型试验结果笔记摘要 该篇论文的核心创新点在于head。论文根据车道线既需要局部信息,也需要全局信息才能很好拟合的特性,设计了相应的算法head。并且论文实验证明该方法…

机器视觉(十一):条码识别

目录: 机器视觉(一):概述 机器视觉(二):机器视觉硬件技术 机器视觉(三):摄像机标定技术 机器视觉(四):空域图像增强 …

记一次虚拟机编译c程序错误

file included from /usr/include/stdio.h:74:0, from opendir.c:2: /usr/include/libio.h:302:3: error: unknown type name ‘size_t’ size_t __pad5; ^ /usr/include/libio.h:305:67: error: ‘size_t’ undeclared here (not in a function) ch…

黑马程序员 Maven 教程

Maven 简介 传统项目管理的缺点: (1) jar 包不统一,jar 包不兼容; (2) 工程升级维护过程操作繁琐; Maven 是什么 Maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型 (POM) POM (Project Object Model) : 项目对…

二分搜索算法

目录1.概述2.代码实现2.1.最基本的二分搜索2.2.搜索最左侧边界2.3.搜索最右侧边界3.应用本文参考: LABULADONG 的算法网站 《大话数据结构》 1.概述 (1)二分搜索 (Binary Search),又称为折半搜索 (Half-interval Search)。它的前…

云收藏系统|基于Springboot实现云收藏系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

Java实现队列

目录 一、队列概述 二、队列的模拟实现 1、入队 2、出队 3、取队头元素 4、获取队列长度 三、循环队列 1、入队 2、出队 3、取队头元素 4、取队尾元素 四、面试题 1、用队列实现栈 2、用栈实现队列 一、队列概述 队列也是常见的数据结构,是一…

Mybatis源码解析二:DataSource数据源负责创建连接以及Transaction的事物管理

简介 对于一个成熟的ORM框架来说,数据源的管理以及事务的管理一定是不可或缺的组成,对于Mybatis来说,为了使用方便以及扩展简单也是做了一系列的封装,这一篇主要介绍mybatis是如何管理数据源以及事务的。 数据源DataSource Dat…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Adversarial Attack(恶意攻击)

文章目录一、基本概念1.1 动机1.2 恶意攻击的例子1.3 如何攻击?二、White Box vs Black Box三、One Pixel Attack四、Universal Adversarial Attack五、Beyond Image六、Attack in the Physical World七、Adversarial Reprogramming八、Backdoor in Model九、防御9.…

TLS回调函数实现反调试

title: TLS回调函数实现反调试.md date: 2022-06-16 23:40:49.231 updated: 2022-06-16 23:41:11.924 url: /archives/tls回调函数实现反调试 categories: tags: 逆向 TLS回调函数实现反调试 TLS-线程局部存储 先于我们OEP执行 #include<stdlib.h> #include<time.…

使用红黑树封装map、set

map、set如何用红黑树封装 map、set应用&#xff1a;map是一个使用参数K、参数V的类模板&#xff0c;set是只使用参数K的类模板。因为map应用时&#xff0c;需要使用到KV&#xff0c;而set只是存单个值&#xff0c;K。红黑树类的存储 &#xff1a;map和set类中使用红黑树数据成…

Logback配置详解

简介&#xff1a; logback是java的日志开源组件&#xff0c;是log4j创始人写的&#xff0c;性能比log4j要好&#xff0c;目前主要分为3个模块&#xff1a; logback-core:核心代码模块logback-classic:log4j的一个改良版本&#xff0c;同时实现了slf4j的接口&#xff0c;这样你…

树莓派mjpg-streamer实现监控功能

树莓派实现监控功能&#xff0c;调用mjpg-streamer库来实现。mjpg-streamer是一个开源的摄像头媒体流&#xff0c;通过本地获取摄像头的数据&#xff0c;通过http通讯发送&#xff0c;可以通过浏览器访问树莓派的IP地址和端口号就能看到视频流。 实现步骤 1.git clone https:…

关于内核的概念理解

狭义的操作系统可以认为就是内核&#xff0c;比如Linux内核。广义的操作系统则包括内核和一系列应用软件&#xff0c;比如Linux内核编辑器vim编译器gcc命令行解释器&#xff08;shell&#xff09;等&#xff0c;通常称为GNU/Linux。 源代码https://github.com/torvalds/Linux …

Jenkins自动化部署SpringBoot项目(windows环境)

文章目录1、Jenkins介绍1.1、概念1.2、优势1.3、Jenkins目的2、环境准备3、Jenkins下载3.1、下载3.2、运行3.3、问题解决4、Jenkins配置4.1、用户配置4.2、系统配置4.3、全局工具配置-最重要5、新建项目7、测试8、错误解决1、Jenkins介绍 1.1、概念 Jenkins是一个开源软件项目…

自动化测试Seleniums~1

一.什么是自动化测试 1.自动化测试介绍 自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或者系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 将测试人员双手解放&#xff0c;将部分测…