结构型模式 (Python版)

代理模式

from abc import ABC, abstractmethod# 买的行为(抽象类)
class Buy(ABC):@abstractmethoddef buy_ticket(self):pass# 男人(具体类)
class Man(Buy):# 男人买票def buy_ticket(self):print("Man 买票成功!")# 女人(具体类)
class Woman(Buy):# 女人买票def buy_ticket(self):print("Woman 买票成功!")# 代理(抽象类)
class Agency(ABC):def __init__(self, people: Buy):self._people = people  # 用来保存要代理的对象(男人或女人)@abstractmethoddef click_to_buy_ticket(self):pass# 美团代理(具体类)
class MeiTuan(Agency):def click_to_buy_ticket(self):print("正在通过美团进行买票...")self._people.buy_ticket()# 携程代理(具体类)
class XieCheng(Agency):def click_to_buy_ticket(self):print("正在通过携程进行买票...")self._people.buy_ticket()if __name__ == '__main__':man = Man()  # 实例化一个男人woman = Woman()  # 实例化一个女人man.buy_ticket()  # 男人直接自己买票woman.buy_ticket()  # 女人直接自己买票meituan = MeiTuan(man)  # 男人使用(打开)了美团meituan.click_to_buy_ticket()  # 通过美团进行买票xiecheng = XieCheng(woman)  # 女人使用(打开)了携程xiecheng.click_to_buy_ticket()  # 通过携程进行买票

装饰者模式

from abc import ABC, abstractmethod# 人物(抽象类)
class People(ABC):def __init__(self):self._wearingState = ""  # 记录人物的穿着状态@abstractmethoddef show(self):  # 展示人物的穿着状态pass# 女孩(具体类)
class Girl(People):def __init__(self):super().__init__()self._wearing_state = "女孩穿着,长裤睡衣,长袖睡衣"def show(self):print(self._wearing_state)# 男孩(具体类)
class Boy(People):def __init__(self):super().__init__()self._wearing_state = "男孩穿着,短裤睡衣,短袖睡衣"def show(self):print(self._wearing_state)# 换装(抽象类)
class ChangeClothes(ABC):def __init__(self, people: People):self._people = people  # 维护一个要进行换装的对象(男孩或女孩)self._changed_state = ""  # 记录换装后的穿着状态# 展示最新的穿着状态@abstractmethoddef show(self):pass# 换成校服
class ChangeIntoSchoolUniform(ChangeClothes):def __init__(self, people: People):super().__init__(people)self._changed_state = "但是最后换成了校服"# 展示最新的穿着状态def show(self):self._people.show()print(self._changed_state)# 换成运动装
class ChangeIntoSportswear(ChangeClothes):def __init__(self, people: People):super().__init__(people)self._changed_state = "但是最后换成了运动装"# 展示最新的穿着状态def show(self):self._people.show()print(self._changed_state)if __name__ == '__main__':# 实例化一个男生,并展示他的穿着状态boy = Boy()boy.show()# 实例化一个女生,并展示她的穿着状态girl = Girl()girl.show()# -------------------- 装饰 - -------------------# 让男生穿上运动装,并再次展示他的穿着状态boy = ChangeIntoSportswear(boy)boy.show()# 让女生穿上校服,并再次展示她的穿着状态girl = ChangeIntoSportswear(girl)girl.show()

适配器模式

对象适配器

"""电源插座案例:三插头和两插头的适配用户本身只有三插头用户现在需要将三插头转换为两插头
"""from abc import ABC, abstractmethod# 三插头(具体类)
class ThreePlug:# 让三插头进行充电def three_plug_charge(self):print("开始充电...")# 两插头形状(抽象类)
class TwoPlugShape(ABC):# 让两插头进行充电(抽象)@abstractmethoddef two_plug_charge(self):pass# 两插头(具体类)
class TwoPlug(TwoPlugShape):# 让两插头进行充电(实现)def two_plug_charge(self):print("开始充电...")# 插头转换器(本质是一个两插头,里面维护了一个三插头对象)
class PlugConverter(TwoPlugShape):def __init__(self, obj: ThreePlug):self._three_plug = obj  # 保存(维护)一个三插头对象# 让两插头进行充电(实现)def two_plug_charge(self):print("温馨提示:您正在使用插头转换器")  # 插头转换器新增的提示功能self._three_plug.three_plug_charge()  # 保持使用三插头原本的充电功能if __name__ == '__main__':# 实例化一个三插头three_plug = ThreePlug()# 先尝试一下直接充电three_plug.three_plug_charge()# 在三插头上面安装一个转换器,将其转成两插头(即:实例化一个插头转换器)two_plug = PlugConverter(three_plug)# 对它进行充电two_plug.two_plug_charge()

类适配器

"""电源插座案例:三插头和两插头的适配用户本身只有三插头用户现在需要将三插头转换为两插头
"""from abc import ABC, abstractmethod# 三插头(具体类)
class ThreePlug:# 让三插头进行充电def three_plug_charge(self):print("开始充电...")# 两插头形状(抽象类)
class TwoPlugShape(ABC):# 让两插头进行充电(抽象)@abstractmethoddef two_plug_charge(self):pass# 两插头(具体类)
class TwoPlug(TwoPlugShape):# 让两插头进行充电(实现)def two_plug_charge(self):print("开始充电...")# 插头转换器(通过同时继承两插头和三插头实现转换)
class PlugConverter(TwoPlugShape, ThreePlug):# 让两插头进行充电(实现)def two_plug_charge(self):print("温馨提示:您正在使用插头转换器")  # 插头转换器新增的提示功能self.three_plug_charge()  # 保持使用三插头原本的充电功能if __name__ == '__main__':# 实例化一个三插头three_plug = ThreePlug()# 先尝试一下直接充电three_plug.three_plug_charge()# 实例化一个插头转换器,它内部自带三插头,但是对外显示两插头two_plug = PlugConverter()# 对它进行充电two_plug.two_plug_charge()

桥接模式

"""案例:生成图案要求:颜色类和形状类进行搭配,生成图案:"红色圆形"、"蓝色圆形"、"红色矩形"、"蓝色矩形"1. 颜色有两个:红色、蓝色2. 形状有两个:圆形、矩形
"""from abc import ABC, abstractmethod# 颜色(抽象类)
class Color(ABC):@abstractmethoddef fill_color(self):pass# 红色(具体类)
class Red(Color):def fill_color(self):print("填充了红色")# 蓝色(具体类)
class Blue(Color):def fill_color(self):print("填充了蓝色")# 形状(抽象类)
class Shape(ABC):def __init__(self):self._color = None  # 用来存放(维护)一个颜色对象def set_color(self, color: Color):  # 设置颜色对象self._color = color@abstractmethoddef _draw_shape(self):  # 画出形状passdef generate(self):  # 生成图案(形状+颜色)self._draw_shape()self._color.fill_color()# 圆形形状(具体类)
class Circle(Shape):def _draw_shape(self):print("画出了圆形 ", end="")# 矩形形状(具体类)
class Rectangle(Shape):def _draw_shape(self):print("画出了矩形 ", end="")if __name__ == '__main__':# 创建对象red = Red()  # 创建一个红色对象blue = Blue()  # 创建一个蓝色对象circle = Circle()  # 创建一个圆形对象rectangle = Rectangle()  # 创建一个矩形对象# 生成图案# 1. 红色圆形circle.set_color(red)circle.generate()# 2. 蓝色圆形circle.set_color(blue)circle.generate()# 3. 红色矩形rectangle.set_color(red)rectangle.generate()# 4. 蓝色矩形rectangle.set_color(blue)rectangle.generate()

外观模式

"""编译过程是比较复杂的,通常包含以下内容:- 编译器在后台进行语法分析- 生成中间代码	(预处理)- 生成汇编代码	(编译)- 生成机器码		(汇编)- 生成可执行程序	(链接)虽然如此,现实中 IDE(集成开发环境) 通常能够给我们提供一键编译的方法,方便了我们的开发下面,我们将模拟这个过程
"""from abc import ABC, abstractmethod# 语法分析
class SyntaxAnalyzer:def syntax_parser(self):print("分析语法中...")# 中间代码
class MidCode:def generate_middle_code(self):print("生成中间代码中...")# 汇编代码
class AssemblyCode:def generate_assembly_code(self):print("生成汇编代码中...")# 机器码
class BinaryCode:def generate_binary_code(self):print("生成机器码中...")# 链接
class Link:def generate_program(self):print("生成可执行程序中...")# IDE(继承开发环境)
class IDE:# 编译def compile(self):# 创建对象sa = SyntaxAnalyzer()mc = MidCode()ac = AssemblyCode()bc = BinaryCode()lk = Link()sa.syntax_parser()mc.generate_middle_code()ac.generate_assembly_code()bc.generate_binary_code()lk.generate_program()print("程序运行中...")if __name__ == '__main__':python_IDE = IDE()python_IDE.compile()  # 一键编译

享元模式

"""享元模式(Flyweight Mode)案例:用户访问多个相似的网站,这些相似的网站之间,有共享的部分,也有自己独有的部分
"""from abc import ABC, abstractmethod# 用户类
class User:def __init__(self, username):self._username = username# 向外提供访问用户名字的接口@propertydef name(self):return self._username# 网站类(抽象)
class AbstractWebsite(ABC):@abstractmethoddef show_page(self, user: User):  # 网站为用户提供了展示页面的功能pass# 网站类(具体)
class Website(AbstractWebsite):def __init__(self, web_name: str):self._web_name = web_namedef show_page(self, user: User):print(f"网站:{self._web_name} 正在为用户:{user.name} 展示页面")# 网站工厂
class WebsiteFactory:def __init__(self):self._website_dict = {}  # 网站字典  (key: value)<==>(web名字: web对象)# 生成网站def generate_website(self, web_name: str):# 判断网站字典中是否存在名字为 web_name 的网站,如果没有就创建一个if web_name not in self._website_dict:self._website_dict[web_name] = Website(web_name)return self._website_dict.get(web_name)# 查看网站数量def check_website_count(self):return len(self._website_dict)if __name__ == '__main__':# 实例化一个网站工厂web_factory = WebsiteFactory()# 让工厂生产出三个网站web_1 = web_factory.generate_website("华为官网")web_2 = web_factory.generate_website("小米官网")web_3 = web_factory.generate_website("腾讯官网")# 实例化三个用户user_1 = User("小明")user_2 = User("小帅")user_3 = User("小美")# 让三个网站,展示页面给三个用户看web_1.show_page(user_1)web_2.show_page(user_1)web_3.show_page(user_1)print("--------------")web_1.show_page(user_2)web_2.show_page(user_2)web_3.show_page(user_2)print("--------------")web_1.show_page(user_3)web_2.show_page(user_3)web_3.show_page(user_3)print("--------------")

组合模式

from abc import ABC, abstractmethod"""案例:通过组合模式,模仿并实现一个简单的目录文件系统
"""# 容器(抽象类)
class Container(ABC):@abstractmethoddef get_name(self):  # 获取名字pass@abstractmethoddef add(self, obj):  # 添加内容pass@abstractmethoddef remove(self, obj):  # 移除内容pass@abstractmethoddef get_children(self):  # 获取所有的子对象pass# 目录(具体类)
class Directory(Container):def __init__(self, directory_name: str):self._directory_name = directory_nameself._children_list = []  # 孩子列表,用来存放所有的子对象(目录的子对象可以是文件对象,也可以是目录对象)def get_name(self):  # 获取目录的名字return self._directory_namedef add(self, obj):  # 向目录里面添加子对象self._children_list.append(obj)def remove(self, obj):  # 移除目录里面的子对象self._children_list.remove(obj)def get_children(self):  # 获取目录下的所有的子对象return self._children_list# 文件(具体类)
class File(Container):def __init__(self, file_name: str):self._file_name = file_nameself._children_list = []  # 孩子列表,用来存放所有的子对象(虽然文件没有子对象,但是为了格式与上面的统一,就保持风格写了这些代码,即:这些代码没有具体的现实意义)def get_name(self):  # 获取文件的名字return self._file_namedef add(self, obj):  # 向文件里面添加子对象(为了保持格式统一,没有具体的现实意义)passdef remove(self, obj):  # 移除文件里面的子对象(为了保持格式统一,没有具体的现实意义)passdef get_children(self):  # 获取文件下的所有的子对象(为了保持格式统一,没有具体的现实意义)return self._children_list# 目录节点树(用来显示目录的内容与结构)
def show_tree(obj: Container, width: int):# ------- 展示当前目录 -------i = 0while i < width:print("---", end="")i += 1print(obj.get_name())  # 展示当前对象的名称# ------- 展示当前目录 -------# ------- 展示当前目录下的子对象 -------children = obj.get_children()  # 获取当前目录所有的孩子对象,children 本质是列表if not children:  # 不存在子对象,直接返回return Nonefor obj in children:  # 将对象逐个遍历出来show_tree(obj, width + 1)# ------- 展示当前目录下的子对象 -------if __name__ == '__main__':# 实例化一个目录,作为根目录root_directory = Directory("C:")# 实例化一个目录,作为子目录,并将其添加到根目录中child_directory = Directory("User")root_directory.add(child_directory)# 实例化四个文件,将前面两个文件添加到根目录中,后面两个文件添加到子目录中file_1 = File("a.txt")file_2 = File("b.txt")file_3 = File("c.txt")file_4 = File("d.txt")root_directory.add(file_1)root_directory.add(file_2)child_directory.add(file_3)child_directory.add(file_4)# 查看根目录的"目录节点树"show_tree(root_directory, 1)"""
运行结果:---C:
------User
---------c.txt
---------d.txt
------a.txt
------b.txt"""

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

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

相关文章

【输入示例100,999 输出示例4】水仙花数

// “水仙花数”是指一个三位正整数&#xff0c;其各位上的数字的立方和等于该数本身。如:1^35^33^3153&#xff0c;因此153是一个水仙花数。输入两个三位正整数a和b(其中a<b)&#xff0c;求[a,b]范围内水仙花数的个数。 //输入示例100,999 //输出示例4 #include <stdio.…

AI爆文写作:如果你有一篇文章爆了,正确的做法是:自己抄袭自己,重复发,还可以继续爆!

爆款总是相似的&#xff0c;如果你有一篇文章爆了&#xff0c;正确的做法&#xff0c;就是重复发&#xff0c;让它继续爆下去。 以前我在小红书看到一个人&#xff0c;将一篇自己火的笔记&#xff0c;连续发了5次&#xff0c;每次点赞数据都不错。 公众号文章也是一样的。 我…

Gin与OpenAPI(Swagger)的使用

一、背景 1、swagger与openapi Swagger&#xff1a; 一种用于描述RESTFUL API的规范&#xff0c;它提供了一种简单的来描述API的请求和相应参数、错误码、返回数据类型等信息&#xff0c;是开发者可以方便了解API使用方式。 官网: https://swagger.io/ OpenAPI : 始于 …

gazebo仿真不起飞——QGC地面站查看下是否参数正确

检查方法&#xff1a;打开QGC地面站查看是否能够切入定点模式&#xff0c;不能的话查看定位数据来源参数

uniapp(微信小程序)退出小程序方法

一、描述 场景是&#xff1a;当用户不予授权的时候&#xff0c;不允许使用该小程序&#xff0c;在用户点击取消之后&#xff0c;应该关闭当前小程序&#xff0c;不让他继续使用。 二、代码 uni.exitMiniProgram({success: function() {console.log(退出小程序成功);},fail: …

鸿蒙HarmonyOS实战-Stage模型(信息传递载体Want)

&#x1f680;前言 应用中的信息传递是为了实现各种功能和交互。信息传递可以帮助用户和应用之间进行有效的沟通和交流。通过信息传递&#xff0c;应用可以向用户传递重要的消息、通知和提示&#xff0c;以提供及时的反馈和指导。同时&#xff0c;用户也可以通过信息传递向应用…

FPGA 第4章 摄像头Bayer转rgb

参考文献 彩色MT9V034摄像头 Bayer转rgb FPGA实现 https://www.cnblogs.com/hqz68/p/10413896.html 文章目录 前言Bayer转rgb算法解析 总结 前言 Bayer格式是相机内部的原始数据, 一般后缀名为.raw。 对于彩色图像,一般是三原色数据&#xff0c;rgb格式。但是摄像头一个像素…

【linux-IMX6ULL-LED字符驱动框架完善】

目录 1.简介&#xff12;.前置知识2.1 重要函数及结构体2.2 程序框架流程 3. 代码详解&#xff1a; 1.简介 在上节&#xff0c;我对linux-IMX6ULL-字符设备驱动简单框架实验进行了说明和构建&#xff0c;但是也存在几个问题&#xff1b; 需要手动指定设备号&#xff0c;不能自…

TCP 与 UDP

0. tcp 与 udp 的 异同特性 TCPUDPname传输控制协议用户数据报协议面向连接&#xff1f; 需要 传输数据前建立连接传输完毕后断开连接不需要可靠的传输数据&#xff1f; 可靠 有确认机制&#xff08;三次握手&#xff09; 有确认、窗口、重传、拥塞控制的机制保证数据可靠传输…

itertools拼装迭代器

itertools拼装迭代器 连接多个迭代器 内置的itertools模块有一些函数可以把多个迭代器连城一个使用。 chain chain可以把多个迭代器从头到尾连成一个迭代器。 import itertoolsit itertools.chain([1, 2, 3], [4, 5, 6]) print(list(it))>>> [1, 2, 3, 4, 5, 6]…

操作视频号小店,新手最关心的问题,一篇给你讲解清楚!

大家好&#xff0c;我是电商小V 新手去做视频号小店的时候&#xff0c;心里面一定是有很多疑问的&#xff0c;会反复咨询一些最关心的问题&#xff0c;因为他们要做好准备&#xff0c;以防后续做店过程中出现问题&#xff0c;其实新手关心的问题就那几个&#xff0c;咱们今天就…

C++贪心算法3

过河的最短时间 #include<bits/stdc.h> using namespace std; void f(int); int n; int main() {system("color 1");cin>>n;int a[10010];for(int i0;i<n;i){cin>>a[i];}sort(a0,an);int ta[1];int k1n-2;int k2n-1;while(true){int t1a[0]a[k…

springboot2+mybatis-plus+vue3创建入门小项目[学生管理系统]02[实战篇]

创建一个 vue 项目 创建这个新的文件夹 创建前端项目 eggbox 数据库 SQL CREATE DATABASE IF NOT EXISTS egg DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; USE egg;CREATE TABLE stu (id INT AUTO_INCREMENT, -- 自增主键name VARCHAR(64) NOT NULL, -- 非空姓名字段&a…

前端传参的三种方式

1、params 传参 参数拼接在地址 url 的后面给后台&#xff1b;地址栏中可见 案例1 地址栏&#xff1a;https://xxxxxxxx/admin/clues/detail?id558 接口代码&#xff1a; export function getClueDetail(query: any) {return request<clueItem>({url: /clues/detai…

Java:图书管理系统

目录 一.book 1.在book包中的Book 类用来定义和引用书的名字&#xff0c;作者&#xff0c;价格&#xff0c;类型等。 2.在book包中的第二个类是BookList是用来构建书架&#xff0c;和书架上的初始书本&#xff0c; 二、ioperations 1.AddOperation (增加图书) 2.BorrowOp…

保研机试算法训练个人记录笔记(七)

输入格式&#xff1a; 在第1 行给出不超过10^5 的正整数N, 即参赛&#xff5d;人数。随后N 行&#xff0c;每行给出一位参赛者的 信息和成绩&#xff0c;包括其所代表的学校的编号&#xff08;从1 开始连续编号&#xff09;及其比赛成绩&#xff08;百分制&#xff09;&#xf…

Linux环境基础开发工具的使用(yum,vim,gcc/g++,make/Makefile,gdb)

Linux 软件包管理器-yum 什么是软件包及安装方式 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理…

数据结构——栈(详细分析)

目录 &#x1f349;引言 &#x1f349;栈的本质和特点 &#x1f348;栈的基本操作 &#x1f348;栈的特点 &#x1f34d;后进先出 &#x1f34d;操作受限 &#x1f34d;动态调整 &#x1f348;栈的优缺点 &#x1f34d;优点 &#x1f34d;缺点 &#x1f349;栈的应用…

002 递归评论 mongodb websocket消息推送

文章目录 商品评论CommentController.javaComment.javaCommentServiceImpl.javaCommentRepository.javaCommentService.javaWebSocketConfig.javaWebSocketProcess.javaapplication.yamlproductReview.htmlindex.htmlindex.jsindex.css 订单评论EvaluateMapper.xmlEvaluateMapp…

从零手写实现 nginx-01-为什么不能有 java 版本的 nginx?

前言 大家好&#xff0c;我是老马。很高兴遇到你。 作为一个 java 开发者&#xff0c;工作中一直在使用 nginx。却发现一直停留在使用层面&#xff0c;无法深入理解。 有一天我在想&#xff0c;为什么不能有一个 java 版本的 nginx 呢&#xff1f; 一者是理解 nginx 的设计…