Python实现外观模式、桥接模式、组合模式和享元模式

今天介绍四种结构型设计模式:外观模式、桥接模式、组合模式和享元模式

外观模式

外观模式(Facade Pattern),它为子系统提供一个统一的接口,使得子系统更加容易使用。

在Python中,我们可以通过定义一个外观类来实现外观模式。这个外观类包含了一组子系统的接口,并提供了一个简单的接口供客户端使用。

下面是一个简单的例子:

class Subsystem1:def method1(self):print("Subsystem1 method1")class Subsystem2:def method2(self):print("Subsystem2 method2")class Facade:def __init__(self):self.subsystem1 = Subsystem1()self.subsystem2 = Subsystem2()def operation(self):self.subsystem1.method1()self.subsystem2.method2()if __name__ == "__main__":facade = Facade()facade.operation()

在这个例子中,Subsystem1Subsystem2是两个子系统,它们分别实现了自己的一组接口。Facade是一个外观类,它包含了Subsystem1Subsystem2的接口,并提供了一个简单的operation接口供客户端使用。

举例说明

假设我们有一个电子商务网站,它包含了一组子系统:商品管理、订单管理、用户管理等。我们可以通过定义一个外观类,将这些子系统的接口封装起来,提供一个简单的接口供客户端使用。

class ProductManager:def add_product(self, product):print("Add product:", product)class OrderManager:def add_order(self, order):print("Add order:", order)class UserManager:def add_user(self, user):print("Add user:", user)class ECommerceFacade:def __init__(self):self.product_manager = ProductManager()self.order_manager = OrderManager()self.user_manager = UserManager()def add_product(self, product):self.product_manager.add_product(product)def add_order(self, order):self.order_manager.add_order(order)def add_user(self, user):self.user_manager.add_user(user)if __name__ == "__main__":facade = ECommerceFacade()facade.add_product("iPhone")facade.add_order("Order001")facade.add_user("User001")

在这个例子中,ProductManagerOrderManagerUserManager是三个子系统,它们分别实现了自己的一组接口。ECommerceFacade是一个外观类,它包含了这三个子系统的接口,并提供了一个简单的add_productadd_orderadd_user接口供客户端使用。

客户端只需要调用ECommerceFacade提供的接口,就可以完成商品、订单、用户的添加操作,而不需要了解具体的子系统实现。这样就大大简化了客户端的代码。

桥接模式

桥接模式(Bridge Pattern),它将抽象部分和实现部分分离开来,使得它们可以独立地变化。在Python中,我们可以通过定义一个抽象类和一个实现类来实现桥接模式。

from abc import ABC, abstractmethodclass Abstraction(ABC):def __init__(self, implementation):self.implementation = implementation@abstractmethoddef operation(self):passclass Implementation:def operation_impl(self):passclass ConcreteAbstraction(Abstraction):def operation(self):self.implementation.operation_impl()

在上面的代码中,我们定义了一个抽象类Abstraction和一个实现类Implementation。在Abstraction类中,我们定义了一个抽象方法operation,在ConcreteAbstraction类中,我们实现了operation方法,调用了实现类的方法。这样,我们就将抽象部分和实现部分分离开来了。

组合模式

组合模式(Composite Pattern),它允许我们将对象组合成树形结构来表示“部分-整体”的层次结构。在Python中,我们可以通过定义一个抽象类和一个组合类来实现组合模式。

from abc import ABC, abstractmethodclass Component(ABC):@abstractmethoddef operation(self):passclass Composite(Component):def __init__(self):self.children = []def add(self, component):self.children.append(component)def remove(self, component):self.children.remove(component)def operation(self):for child in self.children:child.operation()

在上面的代码中,我们定义了一个抽象类Component和一个组合类Composite。在Composite类中,我们定义了一个children列表,用来存储子组件。在addremove方法中,我们可以添加和删除子组件。在operation方法中,我们遍历子组件,调用其operation方法。

享元模式

享元模式(Flyweight Pattern),它通过共享对象来减少内存的使用。在Python中,我们可以通过定义一个享元工厂类和一个享元类来实现享元模式。

class Flyweight:def __init__(self, state):self.state = statedef operation(self, extrinsic_state):passclass FlyweightFactory:def __init__(self):self.flyweights = {}def get_flyweight(self, state):if state not in self.flyweights:self.flyweights[state] = Flyweight(state)return self.flyweights[state]

在上面的代码中,我们定义了一个享元类Flyweight和一个享元工厂类FlyweightFactory。在Flyweight类中,我们定义了一个state属性,表示享元的内部状态,在operation方法中,我们可以传入一个外部状态extrinsic_state,用来改变享元的行为。在FlyweightFactory类中,我们维护了一个flyweights字典,用来存储已经创建的享元对象。在get_flyweight方法中,我们根据传入的状态state,返回一个已经创建的享元对象或者新创建一个享元对象。这样,我们就可以通过共享对象来减少内存的使用了。

学习资源推荐
除了上述分享,学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述
👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以V扫描下方二维码联系领取
保证100%免费

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

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

相关文章

MYSQL08_页的概述、内部结构、文件头、文件尾、最大最小记录、页目录、区段表

文章目录 ①. 页的概述、大小②. 页的内部结构③. 第一部分 - 文件头④. 第一部分 - 文件尾⑤. 第二部分 - 空闲、用户记录、最大最小⑥. 第三部分 - 页目录⑦. 第三部分 - 页面头部⑧. 从数据页角度看B树⑨. 区、段和表、碎片区 ①. 页的概述、大小 ①. 数据库的存储结构&…

YOLO系列汇总 | 持续更新

文章目录 1 YOLOv1(2015, Joseph Redmon)2 YOLOv2(2016, Joseph Redmon)3 YOLOv3(2018, Joseph Redmon)4 YOLOv4(2020, Alexey Bochkovskiy, Chien-Yao Wang)5 YOLOV5(2021,Ultralytics)6 YOLOX(2021, Megvii旷视)7 YOLOv6(2022,美团)8 YOLOv7(2022&…

【深度学习】多层感知机与卷积神经网络解析

引言: 在人工智能的宏伟画卷中,深度学习如同一笔瑰丽而深邃的色彩,为这幅画增添了无限的生命力和潜能。作为支撑这一领域核心技术的基石,多层感知机(MLP)和卷积神经网络(CNN)在模仿人…

vivado ila 运行触发器、停止触发器、使用自动重新触发

运行触发器 您可在 2 种不同模式下运行或装备 ILA 核触发器 : • “ Run Trigger ” : 选择要装备的 ILA 核 , 然后单击“ ILA 仪表板 (ILA Dashboard) ”窗口或“硬件 (Hardware) ”窗口 工具栏上的“ Run Trigger ”按钮即可装备 IL…

MySQL :事务隔离级别实现方法

事务具有四个特性 原子性,要么全成功要么全失败,通过undo log实现持久性,不会因为断电等特殊情况造成数据丢失,通过redo log实现隔离性,事务之间互相不干扰,通过MVCC实现一致性,事务执行前后整…

Java中volatile关键字

保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 1.volatile的可见性 一个典型的例子:永不停止的循环。 public class Forever…

【python】Python上海二手房数据分析可视化(数据集+源码+报告)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Electron 桌面端应用的使用 ---前端开发

Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门…

Spring Boot - 利用MDC(Mapped Diagnostic Context)实现轻量级同步/异步日志追踪

文章目录 Pre什么是MDC(Mapped Diagnostic Context)Slf4j 和 MDC基础工程工程结构POMlogback-spring.xmlapplication.yml同步方式方式一: 拦截器自定义日志拦截器添加拦截器 方式二: 自定义注解 AOP自定义注解 TraceLog切面 测试…

ES查询和监控

es安装 参考https://blog.csdn.net/okiwilldoit/article/details/137107087 再安装kibana,在它的控制台里写es查询语句。 es指南 es权威指南-中文版: kibana用户手册-中文版: es中文社区 es参考手册API es客户端API es查询语句 # 查询e…

Spring Boot:Web开发之三大组件的整合

Spring Boot 前言Spring Boot 整合 ServletSpring Boot 整合 FilterSpring Boot 整合 Listener前言 在 Web 开发中,Servlet 、Filter 和 Listener 是 Java Web 应用中的三大组件。Servlet 是 Java 代码,通过 Java 的 API 动态的向客户端输出内容。Filter 是处于客户端与服务…

74HC595引脚图时序图工作原理

74HC595和74hc164一样是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片, 使用74HC595可以节约单片机mcu的io口资源,用3个io就可以控制8个数码管的引脚,他还具有一定的…

3D-Aware Multi-Class Image-to-Image Translation with NeRFs

3D-Aware Multi-Class Image-to-Image Translation with NeRFs 利用NeRFs实现3D感知的多类图像到图像的翻译 Senmao Li1  Joost van de Weijer2  Yaxing Wang1 李森茂 1 范德维杰 2 王亚兴 1  Fahad Shahbaz Khan3,4  Meiqin Liu5  Jian Yang1 法哈德夏巴兹汗 3,4 刘梅琴 …

CPU架构之---SMP、NUMA

一、缩略词: 缩略词全称含义SMPSymmetric Multi processing对称多处理器(UMA)NUMA(Non-Uniform Memory Access)非一致性内存访问UMAUniform Memory Architecture一致性内存访问 二、SMP简述和框架 2.1 smp简述 SMP(Symmetric M…

随动系统同步性问题(跟随给定和跟随反馈的区别)

1、运动控制比例随动 运动控制比例随动系统_正运动随动系统-CSDN博客文章浏览阅读1.4k次,点赞2次,收藏5次。PLC如何测量采集编码器的位置数据,不清楚的可以参看我的另一篇博文:三菱FX3U PLC高速计数器应用(附代码)_RXXW_Dor的博客-CSDN博客本文主要以三菱FX3U系列的高速…

vue2创建项目的两种方式,配置路由vue-router,引入element-ui

提示:vue2依赖node版本8.0以上 文章目录 前言一、创建项目基于vue-cli二、创建项目基于vue/cli三、对吧两种创建方式四、安装Element ui并引入五、配置路由跳转四、效果五、参考文档总结 前言 使用vue/cli脚手架vue create创建 使用vue-cli脚手架vue init webpack创…

使用Redis实现用户最近浏览记录

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redis是一个key-va…

使用ROCm的HIP API向量加法程序

一、向量加法程序 Radeon Open Compute (ROCm) 是一个开源平台,用于加速高性能计算 (HPC) 和机器学习应用程序。它支持包括GPUs在内的多种硬件,并提供HIP (Heterogeneous-compute Interface for Portability) 作为CUDA代码的便捷转换工具。为了提供一个…

[spring] rest api security

[spring] rest api security 之前的 rest api CRUD 都没有实现验证(authentication)和授权(Authorization),这里使用 Spring security 进行补全 spring security 是一个非常灵活、可延伸的实现方式,比较简…

C语言 | Leetcode C语言题解之第19题删除链表的倒数第N个结点

题目: 题解: struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {struct ListNode* dummy malloc(sizeof(struct ListNode));dummy->val 0, dummy->next head;struct ListNode* first head;struct ListNode* second dummy;f…