设计模式篇---外观模式

news2024/9/22 11:36:18

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式引入了一个新的外观类,它为多个业务类的调用提供了一个统一的入口。主要优点是对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数量。
举个例子,比如查询人员的权限,客户端可以调用外观类的方法,外观类中封装一个方法,方法里面依次调用两个实现类,该方法先是示查询出人员的角色,然后根据查出来的角色去查询角色的权限。将客户端与实现类进行解耦,就不用客户端调两次了,客户端只需要调用外观类一次即可。

结构

在这里插入图片描述

Facade(外观角色):外观角色中知道一个或多个子系统的功能和责任。它用来将客户端发来的请求委派到相应的子系统,传递给乡音的子系统对象处理。
SubSystem(子系统角色):系统中可以有一个或多个子系统角色,每一个子系统都可以被客户端直接调用,或者被外观角色调用。子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

实例

比如我们上班回家后,要做的事情依次是开门、开灯、打开电视,现在用外观模式来完成这个过程。
在这里插入图片描述

Door 类

public class Door {

    public void openDoor(){
        System.out.println("门开了");
    }

}

Lamp类

public class Lamp {

    public void turnOnLight(){
        System.out.println("灯开了");
    }
}

TV类

public class TV {

    public void turnOnTv() {
        System.out.println("电视开了");
    }

}

Facade类

public class Facade {
    private TV tv = new TV();
    private Door door = new Door();
    private Lamp lamp = new Lamp();

    public void open() {
        tv.turnOnTv();
        door.openDoor();
        lamp.turnOnLight();
    }

}

Client 端

public class Client {

    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.open();
    }
}

如果不用外观模式,则客户端的调用方式是这样的:

public class Client {

    public static void main(String[] args) {
        Door door = new Door();
        Lamp lamp = new Lamp();
        TV tv = new TV();
        door.openDoor();
        lamp.turnOnLight();
        tv.turnOnTv();
    }
}

上面是客户端直接调用业务实现类,需要依赖三个子系统,而使用外观模式,则只需要关联一个外观类,降低了系统的耦合度。

总结

优点:
1、它对客户端屏蔽了子系统,减少了客户端所需处理的对象数目,客户端代码变得很简单。
2、它实现了子系统和客户端的松耦合关系,使得子系统的变化不会影响到客户端,只需要更改外观类即可。
缺点:
1、违背开闭原则,有新的子系统加入需要修改外观类。

外观模式和建造者模式的思路很相似。外观模式是将复杂的子系统操作给外观类,客户端直接调用外观类即可;建造者模式是将复杂的操作给指挥者,指挥者内部指挥建造者创建,客户端直接关联指挥者即可。

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

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

相关文章

HSV映射到圆锥坐标系

def bgr2hsvcone(img):arr_hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV)h arr_hsv[..., 0] / 180. * 2s arr_hsv[..., 1] / 255.v arr_hsv[..., 2] / 255.x np.cos(h * np.pi) * s * vy np.sin(h * np.pi) * s * vreturn np.stack((x, y, v), axis-1)

Redis 的集群模式实现高可用

来源:Redis高可用:武林秘籍存在集群里,那稳了~ (qq.com) 1. 引言 前面我们已经聊过 Redis 的主从同步(复制)和哨兵机制,这期我们来聊 Redis 的集群模式。 但是在超大规模的互联网应用中,业务规…

七牛云产品使用介绍之CDN篇

上一篇介绍了七牛云的Kodo对象存储,并用Java SDK实现将本地文件上传到bucekt,接下来是对CDN产品的介绍 CDN(内容分发网络):通过多级缓存实现对Kodo中的资源或者自己网站的资源的加速访问,让你的系统更快更强…

ProPresenter 7 for Mac:Mac电脑好用的文稿演示软件

ProPresenter 7是一款专业的多媒体演示软件,主要用于创建和展示高质量的教堂媒体演示、音乐歌词、幻灯片和视频等。它是一款功能强大且易于使用的软件,被广泛应用于教堂、会议、演唱会和其他场合。以下是ProPresenter 7的一些主要特点和功能:…

VSCode新建Vue项目

前言 Vue.js 是一款流行的 JavaScript 前端框架,它可以帮助开发者轻松构建高性能、可扩展的 Web 应用程序。而 VSCode 则是一款功能强大的开源代码编辑器,它提供了许多有用的工具和插件,可以大幅提高开发效率。 在本文中,我们将…

获取当前用户信息的几种方式

说明:在开发中,我们经常需要获取当前操作的用户信息,如创建用户、创建订单时,我们需要记录下创建人,本文介绍获取当前用户信息的三种方式。 方式一:使用ThreadLocal ThreadLocal本质上是一个Map&#xff…

悄悄上线:CSS @starting-style 新规则

最近 Chrome 117,CSS 又悄悄推出了一个新的的规则,叫做starting-style。从名称上来看,表示定义初始样式。那么,具体是做什么的?有什么用?一起了解一下吧 一、快速了解 starting-style 通常做一个动画效果…

基于springboot实现班级综合测评管理系统项目【项目源码+论文说明】

基于springboot实现班级综合测评管理系统演示 摘要 随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的&#x…

HarmonyOS ArkTS语言,运行Hello World(一)

一、下载与安装DevEco Studio 在HarmonyOS应用开发学习之前,需要进行一些准备工作,首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网,单击“立即下载”进入下载页面。 DevEco Studio提供了Windows…

这是基础校园二手交易框架

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>校园二手交易</title> <style> /* Reset stylesheet */ * { margin: 0; padding: 0; box-s…

HCIA-实验命令基础学习:

视频学习&#xff1a; 第一部分&#xff1a;基础学习。 19——子网掩码。 27——防火墙配置&#xff1a; 32——企业级路由器配置&#xff1a; 基础实验完成&#xff1a;&#xff08;完成以下目录对应的实验&#xff0c;第一部分基础实验就完成。&#xff09; 方法&#xff…

牛客 最小公配数 golang版实现

题目请参考: HJ108 求最小公倍数 题解: 在大的数的倍数里面去找最小的能整除另外一个数的数&#xff0c;就是最小公倍数&#xff0c;按照大的来找&#xff0c;循环次数能够降到很少&#xff0c;提升效率 golang实现: package mainimport ("fmt" )func main() {a : …

>Web 3.0顶级干货教学:浅析区块链与货币关系

Web 3.0顶级干货教学&#x1f525;&#xff1a;浅析区块链与货币关系 尊重原创&#xff0c;编写不易 &#xff0c;帮忙点赞关注一下~转载小伙伴请注明出处&#xff01;谢谢 1.0 数字交易 最早一笔数字化交易 是在www.PizzaHut.com 在 1994 年产生的&#xff0c;但是有趣的事情…

代餐粉产业分析:中国市场销售额增长至116.94亿元

近年来&#xff0c;随着人们生活节奏的加快和健康意识的增强&#xff0c;代餐粉市场规模逐渐壮大。在这个忙碌的时代&#xff0c;快捷、营养而又方便的代餐粉成为了许多人选择的首选。 随着健康理念的不断普及和推广&#xff0c;人们开始更加重视日常饮食的健康与营养。代餐粉作…

VUE excel表格导出

js代码 //下载模板 downloadExl() { // 标题 const tHeader [‘xxx’,xxx,xx名称,电枪xx,协议xx,snxx]; // key const filterVal [agentName, stationName, equName, channelNumber, manufacturer, sn, ]; // 值 const datas [ { agentName: 你好, stationName: 我们, e…

Doris 简介(一)

Apache Doris 由百度大数据部研发&#xff08;之前叫百度 Palo&#xff0c;2018 年贡献到 Apache 社区后&#xff0c;更名为 Doris &#xff09;&#xff0c;在百度内部&#xff0c;有超过 200 个产品线在使用&#xff0c;部署机器超过 1000 台&#xff0c;单一业务最大可达到上…

nohup 实现远程运行不关机操作

nohup 实现远程运行不宕机操作 python nohup 实现远程运行不宕机操作 - python教程网 远程运行最怕断电&#xff0c;训练了几个小时的数据说没就没&#xff0c;或者停止运行。 用nohup 记录代码的输出&#xff0c;还可以不受断电的影响。 方法 1. 用nohup 运行一个python文…

基于window10的远程桌面报错:要求的函数不受支持 的问题解决方法

基于window10的远程桌面报错&#xff1a;要求的函数不受支持 的问题解决方法 设置方法&#xff1a; 一、WINR 在框内输入gpedit.msc 二、依次打开 计算机配置----管理模板-----系统—凭据分配—加密数据库修正–改为以启用—易受攻击 第一步&#xff1a; 第二步&#xff1a;…

Springboot企业网站 毕业设计-附源码73192

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

qlik为app添加定时调度

1&#xff0c;进入qmc/Apps 2&#xff0c;搜索需要添加调度的APP 3&#xff0c;搜索到后双击点开Tasks 4&#xff0c;新增Tasks---点击Create New 5&#xff0c;添加调度器 6&#xff0c;设置调度&#xff0c;双击新增的调度&#xff0c;注意选择时区