Python 如何实现外观设计模式?什么是 Facade 外观设计模式?Python 设计模式示例代码

什么是(Facade)外观设计模式?

外观(Facade)设计模式是一种结构型设计模式,它提供了一个简化复杂系统接口的高级接口,使得系统更容易使用。外观模式通过定义一个高层接口,隐藏了系统的复杂性,为客户端提供了一个更加简单和一致的接口。

外观设计模式,python设计模式

外观模式的主要目标是降低系统的耦合度。通过引入一个外观类,客户端只需要与外观类交互,而无需直接与系统中的多个子系统交互。这种方式可以减少客户端与子系统之间的依赖关系,提高系统的灵活性和可维护性。

主要角色:

  1. 外观(Facade)类: 提供了一个简化的接口,将客户端与系统中的多个子系统解耦。外观类知道如何处理客户端的请求,并将请求分派给适当的子系统。

  2. 子系统: 实际执行工作的组件或类。外观模式将客户端与子系统分离,使得子系统能够更容易地被替换或修改,而不会影响客户端。

优点:

  1. 简化客户端代码: 外观模式提供了一个简单的接口,隐藏了系统的复杂性,使得客户端使用起来更加方便。

  2. 降低耦合度: 客户端不需要了解系统内部的复杂结构,只需与外观类进行交互。这降低了客户端与子系统之间的耦合度,使得系统更加灵活。

  3. 更好的封装性: 外观模式提供了一个独立的接口,使得系统的实现细节被封装在子系统内部,不直接暴露给客户端。

  4. 易于维护: 由于外观模式降低了客户端与子系统的直接联系,系统的维护变得更加容易。对子系统的修改不会影响到客户端。


Python 实现外观设计模式示例代码(一):

考虑一个计算机启动的例子,计算机的启动过程可能涉及多个子系统,如CPU、内存、硬盘等。外观模式可以为客户端提供一个简化的启动接口,隐藏启动过程的复杂性。

# 子系统 - CPU
class CPU:def start(self):print("CPU is starting")# 子系统 - 内存
class Memory:def start(self):print("Memory is starting")# 子系统 - 硬盘
class HardDrive:def start(self):print("Hard Drive is starting")# 外观类
class ComputerFacade:def __init__(self):self.cpu = CPU()self.memory = Memory()self.hard_drive = HardDrive()def start(self):print("Computer is starting...")self.cpu.start()self.memory.start()self.hard_drive.start()print("Computer has started")# 客户端
computer_facade = ComputerFacade()
computer_facade.start()

在这个例子中,ComputerFacade 提供了一个简化的接口 start(),客户端只需与 ComputerFacade 交互,而不需要了解启动过程的复杂性。外观模式将启动过程的实现细节隐藏在子系统内部。


Python 实现外观设计模式示例代码(一):

假设我们有一个在线购物系统,用户可以浏览商品、添加商品到购物车、进行结账等操作。系统中可能涉及到多个子系统,比如库存管理、购物车管理、支付系统等。外观模式可以用来简化用户购物的过程。

# 子系统 - 库存管理
class Inventory:def check_stock(self, product_id):print(f"Checking stock for product {product_id}")def decrease_stock(self, product_id, quantity):print(f"Decreasing stock for product {product_id} by {quantity}")# 子系统 - 购物车管理
class ShoppingCart:def add_to_cart(self, product_id, quantity):print(f"Adding {quantity} units of product {product_id} to the shopping cart")def checkout(self):print("Checking out the shopping cart")# 子系统 - 支付系统
class Payment:def process_payment(self, amount):print(f"Processing payment of {amount} via credit card")# 外观类
class OnlineShoppingFacade:def __init__(self):self.inventory = Inventory()self.shopping_cart = ShoppingCart()self.payment = Payment()def purchase_product(self, product_id, quantity):self.inventory.check_stock(product_id)self.shopping_cart.add_to_cart(product_id, quantity)self.inventory.decrease_stock(product_id, quantity)self.shopping_cart.checkout()self.payment.process_payment(quantity * 10)  # Assuming each unit costs $10# 客户端
shopping_facade = OnlineShoppingFacade()
shopping_facade.purchase_product("ABC123", 2)

在这个例子中,OnlineShoppingFacade 提供了一个简化的购物接口 purchase_product,客户端只需与外观类交互,而不需要了解库存管理、购物车管理和支付系统的具体实现。这使得购物过程对用户而言更加简单,同时保持了系统的灵活性。外观模式将不同子系统的复杂性隐藏在背后,提供了一个更加友好和一致的接口。


使用外观设计模式,需要注意哪些方面?

在使用外观设计模式时,需要注意一些关键的地方,以确保模式的有效实施和系统的良好设计。以下是一些需要注意的方面:

  1. 不要过度设计: 外观模式的目标是简化接口,而不是增加新的复杂性。不要在外观类中添加过多的方法,避免让外观类变得庞大和难以维护。

  2. 灵活性和扩展性: 外观模式应该保持系统的灵活性。确保客户端仍然可以直接访问子系统,以满足一些特殊需求。同时,设计模式应该支持对子系统的扩展,而不会影响客户端。

  3. 接口设计的一致性: 外观模式的目标是提供一个一致的接口,确保外观类的接口易于理解和使用。注意保持接口的一致性,避免引入令人困惑的命名或不必要的复杂性。

  4. 避免暴露细节: 外观模式的目标之一是隐藏系统的复杂性。确保外观类仅公开客户端需要知道的方法,而将系统内部的实现细节隐藏起来。

  5. 合理的粒度: 设计外观类时,考虑粒度的问题。外观类应该提供足够的抽象,但又不应该太过抽象,以至于导致客户端无法完成特定的任务。

  6. 与单一职责原则协调: 外观类应该遵循单一职责原则,即一个类应该有且仅有一个改变的理由。如果一个外观类变得臃肿,可能需要考虑分解为多个更小的外观类。

  7. 子系统的独立性: 外观模式并不应该影响子系统的独立性。确保子系统可以独立工作,而不过分依赖外观模式。

  8. 与其他模式的协作: 考虑外观模式与其他设计模式的协作。外观模式通常与其他模式如工厂模式、适配器模式等协同使用,以达到更好的系统设计。

  9. 对性能的考虑: 尽管外观模式提供了简化接口的好处,但在某些情况下可能会引入性能开销。在涉及大量复杂子系统的情况下,需谨慎使用,以确保性能不受太大影响。

  10. 良好的文档和注释: 为外观类提供良好的文档和注释,解释每个方法的作用和使用方式,以方便其他开发人员理解和使用。

综上所述,合理使用外观模式需要平衡简化接口和保持灵活性之间的关系,并确保在系统设计中能够达到所期望的效果。


本文就到这里了,感谢您的阅读 。别忘了点赞、收藏~ Thanks♪(・ω・)ノ 🍇

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年中国恒温蜡疗仪发展趋势分析:应用前景存有很大发展与探索空间[图]

恒温电蜡疗仪可将蜡熔化,利用蜡自身特点,能阻止热的传导、散热慢、气体和水分不易消失,保温性能优越。利用蜡能紧密贴于体表的可塑性,可加入其他药物协同进行治疗,也可将中药与蜡疗有机地结合在一起,产生柔…

【Linux】Linux进程间通信(二)

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】…

《QT从基础到进阶·三十》QVariant的基础用法

很多时候,需要几种不同的数据类型需要传递,如果用结构体,又不大方便,容器保存的也只是一种数据类型,而QVariant则可以统统搞定。 QVariant可以保存QT和C常用类型,如果是自定义类型,比如struct,c…

什么是PWA(Progressive Web App)?它有哪些特点和优势?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

2023年中国逆流式冷却塔性能特点、应用领域及市场规模分析[图]

按冷却塔热交换时气流和水流方向不同的配置,机力通风冷却塔又可分为横流式冷却塔、逆流式冷却塔,目前主流的冷却塔型式为逆流式冷却塔,逆流式冷却塔(counterflowcoolingtower)是指水流在塔内垂直落下,气流方…

【C++学习手札】模拟实现string

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:缶ビール—みゆな 0:41━━━━━━️💟──────── 2:52 🔄 ◀️ ⏸ ▶️ ☰ &…

linux进程间通信之管道通信

Linux 进程间通信机制分三类:数据交互,同步,信号。理解了这些机制才能灵活运用操作系统提供的 IPC 工具。 一.管道 管道是一种文件形式,是内核的一块缓冲区。匿名管道只能用于具有亲缘关系的进程间通信,命名管道可以用…

在Linux上安装Oracle 数据库 11g (含静默方式安装)

好久没碰11g了,今天(2023年11月16日)因为有个需求又装了一遍。 在OCI上安装了一个Oracle Linux 6实例: $ uname -a Linux instance-20231116-1239-db11g 4.1.12-124.80.1.el6uek.x86_64 #2 SMP Mon Oct 9 02:32:10 PDT 2023 x86…

多维度梳理 MySQL 锁

多维度梳理 MySQL 锁 1、并发问题的解决方案2、MySQL的各类型锁2.1、从数据操作的类型划分 (读锁、写锁)2.2、从数据操作的粒度划分2.2.1、表锁2.2.1.1、表级别的S 锁、X 锁2.2.1.2、意向锁(IS、IX)2.2.1.3、自增锁2.2.1.4、元数据锁 2.2.2、行锁2.2.2.1…

华为eNSP综合实验考试

VLAN信息表 设备名称 端口 链路类型 VLAN 参数 HZ-HZCampus-Agg01-S5731 GE0/0/1 Trunk PVID:1 Allow-pass:10 20 Eth-trunk1(GE0/0/2,0/0/3,0/0/23) Trunk PVID:1 Allow-pass:10 20 GE0/0/24 Access PVID&#xf…

AttributeError: module ‘gradio‘ has no attribute ‘ClearButton‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

(1)(1.16) Maxbotix I2C声纳

文章目录 前言 1 连接到Pixhawk 2 通过Mission Planner进行设置 3 测试传感器 4 参数说明 前言 Maxbotix I2C EZ4 声纳(又称 I2CXL-MaxSonar-EZ4 或 MB1242)是一种相对便宜的短距离(最多 7m)测距仪,主要设计用于…