漫谈设计模式 [9]:外观模式

news/2024/9/19 12:02:24/ 标签: 设计模式, python, 外观模式

引导性开场

菜鸟:老鸟,我最近在做一个项目,感觉代码越来越复杂,我都快看不懂了。尤其是有好几个子系统,它们之间的调用关系让我头疼。

老鸟:复杂的代码确实让人头疼。你有没有考虑过使用设计模式来简化你的代码结构?

菜鸟设计模式?我听说过一些,但不太了解。你觉得我应该用哪个模式呢?

老鸟:听起来你的问题可能适合用**外观模式(Facade Pattern)**来解决。我们可以一起探讨一下。

渐进式介绍概念

菜鸟外观模式?能不能解释一下是什么?

老鸟:好,我们先从一个生活中的例子说起。你买了一台新电视,电视上有很多接口,比如HDMI、USB、网线等等。如果每次你都要自己插各种线并调整设置,会很麻烦对吧?

菜鸟:是的,确实很麻烦。

老鸟:于是,你买了一个万能遥控器,这个遥控器可以帮助你一键连接所有设备并调整设置。你只需要按一个按钮,就可以享受电视和其他设备的无缝连接。

菜鸟:听起来不错,这和编程有什么关系呢?

老鸟:在编程中,外观模式就像这个万能遥控器。它提供一个简单的接口,隐藏了复杂的子系统调用。你只需要通过外观接口进行操作,而无需关心内部的复杂逻辑。

Python代码示例,逐步展开

菜鸟:能给我举个例子吗?

老鸟:当然可以。假设你有一个家庭影院系统,包括DVD播放器、投影仪和音响系统。我们先写出这几个子系统的类。

python">class DVDPlayer:def on(self):print("DVD Player is on")def play(self, movie):print(f"Playing {movie}")class Projector:def on(self):print("Projector is on")def set_input(self, input):print(f"Projector input set to {input}")class SoundSystem:def on(self):print("Sound System is on")def set_volume(self, level):print(f"Volume set to {level}")

菜鸟:每个子系统都有自己的方法,如果我要开电影,需要一个个调用他们的方法对吧?

老鸟:是的,这样会很麻烦。现在我们来创建一个外观类,它提供一个简单的接口来控制整个家庭影院系统。

python">class HomeTheaterFacade:def __init__(self, dvd_player, projector, sound_system):self.dvd_player = dvd_playerself.projector = projectorself.sound_system = sound_systemdef watch_movie(self, movie):print("Get ready to watch a movie...")self.dvd_player.on()self.dvd_player.play(movie)self.projector.on()self.projector.set_input("DVD")self.sound_system.on()self.sound_system.set_volume(5)print("Movie started!")

菜鸟:哇,这样确实简单多了!我只需要调用watch_movie方法就行了。

老鸟:没错,我们来看看如何使用这个外观类。

python">dvd_player = DVDPlayer()
projector = Projector()
sound_system = SoundSystem()home_theater = HomeTheaterFacade(dvd_player, projector, sound_system)
home_theater.watch_movie("Inception")

菜鸟:代码变得清晰多了,这样维护也更容易。

问题与反思

菜鸟:如果我不使用外观模式,直接在主代码中调用子系统的方法,会有什么问题吗?

老鸟:最大的麻烦就是代码的复杂性和可维护性。每次你修改子系统的实现,都需要在主代码中找到相关的调用并修改。而使用外观模式,你只需要修改外观类的实现,主代码无需改变。

优势与适用场景

菜鸟外观模式还有哪些优势呢?

老鸟外观模式的主要优势包括:

  1. 简化接口:提供一个简单的接口,隐藏底层复杂性。
  2. 松散耦合:减少子系统之间的依赖关系,提高代码的可维护性。
  3. 更好的分层设计:有助于系统分层,使得高层代码更简洁。

适用场景包括:

  • 当你有一个复杂的子系统,需要提供一个简单的接口给客户端。
  • 当你希望对子系统进行解耦,使得子系统的变化不会影响到高层代码。

常见误区与优化建议

菜鸟:听起来外观模式很有用,那有没有什么常见的误区需要注意?

老鸟:有的。一个常见误区是把所有逻辑都放在外观类中,导致外观类变得臃肿。外观类应该只负责协调子系统的调用,而不应该包含太多业务逻辑。

另一个需要注意的是,外观模式并不能完全取代子系统的接口。在某些情况下,客户端可能仍然需要直接调用子系统的方法。

总结与延伸阅读

老鸟:今天我们介绍了外观模式,通过一个家庭影院的例子,你学会了如何使用外观模式来简化代码结构。外观模式的核心思想是提供一个简单的接口,隐藏底层的复杂性。

如果你感兴趣,可以继续学习其他设计模式,比如单例模式、观察者模式等。我推荐《设计模式:可复用面向对象软件的基础》这本书,里面有详细的介绍。

菜鸟:谢谢老鸟,我受益匪浅!我会继续学习其他设计模式的。

老鸟:不客气,编程的道路上我们一起进步!


http://www.ppmy.cn/news/1523318.html

相关文章

微信支付开发避坑指南

1 微信支付的坑 1.1 不能用前端传递过来的金额 订单的商品金额要从数据库获取,前端只传商品 id。 1.2 交易类型trade type字段不要传错 v2版API,不同交易类型,要调用的支付方式也不同。 1.3 二次签名 下单时,在拿到预支付交…

记录深度学习量化操作

0. 简介 深度学习中做量化提升运行速度是最常用的方法,尤其是大模型这类非常吃GPU显存的方法。一般是高精度浮点数表示的网络权值以及激活值用低精度(例如8比特定点)来近似表示达到模型轻量化,加速深度学习模型推理,目…

MySQL表的操作与数据类型

目录 前言 一、表的操作 1.创建一个表 2.查看表的结构 3.修改表 4.删除一个表 二、 MySQL的数据类型 0.数据类型一览: 1.整数类型 2.位类型 3.小数类型 4.字符类型 前言 在MySQL库的操作一文中介绍了有关MySQL库的操作,本节要讲解的是由库管理的结构——…

TinyWebSever源码逐行注释(三)_ thread_pool.cpp

前言 项目源码地址 项目详细介绍 项目简介: Linux下C轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器. 使用 线程池 非阻塞socket epoll(ET和LT均实现) 事件处理(Reactor和模拟Proactor均实现) 的并发模型使用状态机…

python基础语法四-数据可视化

书接上回: python基础语法一-基本数据类型 python基础语法二-多维数据类型 python基础语法三-类 1. plot函数绘制简单折线图 (1)需要的模块:matplotlib.pyplot (2)语法:matplotlib.pyplot.plot(x, y, format_string, **kwargs) x: x轴数…

C语言程序设计-练习篇

不知道结果仍义无反顾地才是勇士。 三&#xff0c;打印整数二进制的奇数位和偶数位 题目内容&#xff1a; 获取一个整数二进制序列中所有的奇数位和偶数位&#xff0c;分别打印出二进制序列 #include <stdio.h>//打印整数二进制的奇数位和偶数位 int main() {int i 0…

C语言从头学55——学习头文件errno.h、float.h

1、头文件 errno.h 中的变量 errno 的使用 在 errno.h 定义了一个 int 类型的变量 errno&#xff08;错误码&#xff09;&#xff0c;如果发现这个变量出现非零值&#xff0c;表示已经执行的函数发生了错误。这个变量一般多用于检查数学函数运算过程中发生的错误。 …

Vue面试题——项目介绍以及SPA介绍

谈谈你开发的项目背景与、架构和技术栈 项目背景 假设我们正在开发一个名为“智慧旅游助手”的Web平台。该平台旨在为用户提供一站式的旅游服务&#xff0c;包括目的地推荐、酒店预订、行程规划、在线购票&#xff08;如门票、机票&#xff09;、旅游攻略分享以及基于地理位置…

不到200行代码,一键写出简单贪吃蛇网页游戏!附详细代码!快来看看吧!

​哈喽大家好&#xff0c;这里是大白百宝阁&#xff0c;每天分享一段小代码~ 今天要分享的是&#xff0c;不到200行代码&#xff0c;制作html版贪吃蛇&#xff0c;效果如下&#xff1a; 游戏结束后&#xff0c;还会显示&#xff1a; 代码如下&#xff1a; <!DOCTYPE html&g…

传统CV算法——边缘算子与图像金字塔算法介绍

边缘算子 图像梯度算子 - Sobel Sobel算子是一种用于边缘检测的图像梯度算子&#xff0c;它通过计算图像亮度的空间梯度来突出显示图像中的边缘。Sobel算子主要识别图像中亮度变化快的区域&#xff0c;这些区域通常对应于边缘。它是通过对图像进行水平和垂直方向的差分运算来…

基于Java+SpringBoot+Vue+MySQL的美容美发管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的美容美发管理系统【附源码文档】、前后…

【Visual Studio 报错】vs 在使用二进制写入文件时弹窗报错:使用简体中文 gb2312 编码加载文件

如以下报错 解决办法 解决方法&#xff1a;文件->高级保存选项->将文件编码形式改为“UTF-8带签名” 若找不到高级保存选项&#xff0c;可以跟着下面路径把该选项调出来 &#xff1a;工具->自定义->命令->菜单栏中改成文件->预览右边点添加命令->类别中…

第二证券:涨停潮!传手机将使用钛金属外壳?

今天早盘&#xff0c;银行股再度重挫&#xff0c;导致上证指数、上证50纷乱创出阶段性新低&#xff0c;上证指数跌破2800点&#xff0c;小盘成长股则大面积反弹&#xff0c;创业板指、科创50等股指飘红。 盘面上&#xff0c;新式烟草、钛金属、锂矿、玻璃基板等板块涨幅居前&a…

全球性“微软蓝屏”事件的深思:网络安全与系统稳定性的挑战与应对

近日&#xff0c;由于微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;成为科技领域的热点新闻。这次事件不仅影响了全球约850万台设备&#xff0c;波及航空、医疗、传媒等关键行业&#xff0c;还导致美国超过2.3万架次航班延误。如此规模的系统中断&#xff0c;…

【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro

目录 1、环境准备2、引入 Shiro3、实现认证、退出3.1、使用死数据实现3.2、引入数据库&#xff0c;添加注册功能后端代码前端代码 3.3、MD5、Salt 的认证流程 4.、实现授权4.1、基于角色授权4.2、基于资源授权 5、引入缓存5.1、EhCache 实现缓存5.2、集成 Redis 实现 Shiro 缓存…

qt怎么格式化字符串?

在Qt中&#xff0c;格式化字符串可以通过多种方式实现&#xff0c;主要依赖于你的具体需求和上下文。下面列出了一些常见的方法&#xff1a; 1. 使用QString的arg()方法 QString类提供了arg()方法&#xff0c;这个方法允许你插入值到字符串中的占位符位置。占位符由%1、%2等表…

详细步骤!分享6款AI论文写作助手自动生成器实例操作!

在当今学术研究和写作领域&#xff0c;AI论文生成工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。以下是6款推荐的AI论文写作助手自动生成器实例操作&#xff0c;特别推荐千笔-AIPassPa…

pytorch张量运算的广播机制

PyTorch 的广播机制&#xff08;broadcasting&#xff09;是指在进行张量运算时&#xff0c;自动扩展较小张量的形状以匹配较大张量的形状&#xff0c;使它们能够进行逐元素运算。广播机制避免了手动扩展张量的繁琐过程&#xff0c;并且在不增加内存开销的情况下进行高效计算。…

黑马点评16——多级缓存-JVM进程缓存

文章目录 什么是多级缓存导入商品案例初识Caffeine实现进程缓存 什么是多级缓存 但是现在的nginx的压力太大了&#xff0c;所以nginx也要部署成集群 当然我们的redis、tomcat都可以部署成集群 导入商品案例 我们在docker中开启了一个mysql的数据库&#xff0c;里面配置了一个…

如何从 Bak 文件中恢复 SQL数据库?(3种方法)

如何从 .bak 文件恢复 SQL数据库&#xff1f; 在数据库管理和维护过程中&#xff0c;数据的安全性和完整性至关重要。备份文件&#xff08;.bak 文件&#xff09;是 SQL Server 中常用的数据库备份格式&#xff0c;它包含了数据库的完整副本&#xff0c;用于在数据丢失、系统故…