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

news2025/1/14 19:39:36

什么是(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.coloradmin.cn/o/1218605.html

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

相关文章

花 200 元测试 1300 个实时数据同步任务

背景 对于将数据作为重要生产资料的公司来说,超大规模的数据迁移同步系统( 1k、5k、10k 条同步任务)是刚需。 本文以此为出发点,介绍近期 CloudCanal 所做的一个容量测试:在单个 CloudCanal 集群上创建 1300 实时任务,验证系统是…

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

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

思维导图软件 Xmind mac中文版特点介绍

XMind 2022 mac是一款思维导图软件,可以帮助用户创建各种类型的思维导图和概念图。 XMind mac软件特点 - 多样化的导图类型:XMind提供了多种类型的导图,如鱼骨图、树形图、机构图等,可以满足不同用户的需求。 - 强大的功能和工具&…

扩散模型实战(十):Stable Diffusion文本条件生成图像大模型

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散模型实战(三):扩散模型的应用 扩散模型实战(四&#xff…

(免费领源码)基于Vue+Node.js的宠物领养网站的设计与开发83352-计算机毕业设计项目选题推荐

摘 要 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络的发达,宠物领养网站的…

User parameters自定义用户参数 (zabbix监控)

1、介绍和用法 ① 介绍 自定义用户参数,也就是自定义key 有时,你可能想要运行一个代理检查,而不是Zabbix的预定义 你可以编写一个命令来检索需要的数据,并将其包含在代理配置文件("UserParameter"配置参数)的用户参数中…

m1 rvm install 3.0.0 Error running ‘__rvm_make -j8‘

在使用M1 在安装cocopods 前时,安装 rvm install 3.0.0遇到 rvm install 3.0.0 Error running __rvm_make -j8 备注: 该图片是借用其他博客图片,因为我的环境解决完没有保留之前错误信息。 解决方法如下: 1. brew uninstall --ignore-depe…

物理驱动深度学习方法总结

一、物理驱动深度学习方法总结 现有博主更新物理驱动深度学方法总体介绍 二、 PINN介绍 PINN综述Blog介绍:内嵌物理知识神经网络 (Physics Informed Neural Network,简称PINN) 是一种科学机器在传统数值领域的应用方法&…

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

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

[模版总结] - 树的基本算法2 - BST

BST定义 BST - Binary Search Tree, 即二叉搜索树(有序二叉树) 特性 中序遍历有序查找/插入/删除某个数值可以通过 即树的高度,最优,最坏 . 有多种改进BST可以动态维持插入删除后树结构能尽可能保持平衡 BST基本操作 查询 - 二分查找 搜索数值 - 二分法 class…

JTS: 25 Index 索引

文章目录 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 package pers.stu.index;import org.locationtech.jts.geom.*; import org.locationtech.jts.index.hprtree.HPRtree; import org.locationtech.jts.index.quadtree.Quadtree; import org.lo…

【MySQL8】1130 - Host ‘***‘ is not allowed to connect to this MySOL server

问题描述 使用 Navicat 连接 MySQL8 报错: 1130 - Host *** is not allowed to connect to this MySOL server解决方案 use mysql;select host ,user from user; -- 将 root 用户的主机(host)值修改为 %,即允许从任何主机连接 …

电脑集中管理软件有哪些?电脑集中管控怎么做

电脑集中管理软件有哪些?电脑集中管控怎么做 电脑集中管理软件是指通过一种软件或系统,对多台电脑进行集中管理和控制的工具。这种软件通常具备远程控制、软硬件监控、自动部署等功能。可以方便企业或组织统一管理电脑资源,提高工作效率。今…

新版软考高项试题分析精选(四)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1、一般而言,大型软件系统中实现数据压缩功能,工作在OSI参考模型的( )。 A.应用层 B.表示层 C.会话层 D.网络层…

Odoo 15开发手册第七章 记录集 - 使用模型数据

在前面的章节中,我们概览了模型创建以及如何向模型加载数据。现在我们已有数据模型和相关数据,是时候学习如何编程与其进行交互了。 业务应用需要业务逻辑来计算数据、执行验证或自动化操作。Odoo框架API为开发者提供了工具用于实现这种业务逻辑。大多数…

有Mac或无Mac电脑通用的获取安卓公钥的方案

从2023年9月开始,所有上架应用市场的app都需要进行APP备案。 其中后端服务器在阿里云的可以在阿里云备案,后端服务器在腾讯云的可以在腾讯云备案。但无论你是在什么云厂商里做备案,无一例外的是,无论是上架安卓应用还是上架IOS应…

如何将图片转为excel或word?(客户端)

演示软件:金鸣表格文字识别大师3.6.1(新版本界面可能会略有不同) 第一部分 将图片转为excel或文表混合的word 一般的软件要将图片转为可编辑的excel,都需要待识别的图片要有明显清晰的表格线,但我们程序现已克服了这…

多线程概述及创建

什么是线程? 线程(thread)是一个程序内部的一条执行路径。 我们之前启动程序执行后,main方法的执行其实就是一条单独的执行路径。 程序中如果只有一条执行路径,那么这个程序就是单线程的程序。 多线程是什么? 多线程是指从软…

把GPT知识库当成记事本,非常有趣的玩法,很欢乐!

1. 笔者创建了一个“每天碎碎念”知识库,把重要的事情保存成文件记录,并进行训练。 2. 这样每当我记不清楚的时候 就开始灵魂发问~ 3. GPT最擅长胡编乱造,万一他忽悠我怎么办,别着急。查看“知识原文”就知道他是否忽悠你了。 这…

C# 实时监控双门双向门禁控制板源码

本示例使用设备:实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.…