当前位置: 首页 > news >正文

【设计模式】3.装饰模式

every blog every motto: You can do more than you think.
https://blog.csdn.net/weixin_39190382?type=blog

0. 前言

装饰模式

1. 第一版

class Person:def __init__(self, name):self.name = namedef wear_t_shirts(self):print("大T恤 ", end="")def wear_big_trouser(self):print("垮掉 ", end="")def wear_sneakers(self):print("破球鞋 ", end="")def wear_suit(self):print("西装 ", end="")def wear_tie(self):print("领带 ", end="")def wear_leather_shoes(self):print("皮鞋 ", end="")def show(self):print(f"装扮的{self.name}")# 客户端代码
if __name__ == "__main__":xc = Person("小菜")print("\n第一种装扮: ")xc.wear_t_shirts()xc.wear_big_trouser()xc.wear_sneakers()xc.show()print("\n第二种装扮: ")xc.wear_suit()xc.wear_tie()xc.wear_leather_shoes()xc.show()input()  # 相当于C#的Console.Read()

增加"超人"类,需要修改Person,违反了开放-封闭原则

2. 第二版

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

from abc import ABC, abstractmethod# Person 类
class Person:def __init__(self, name):self.name = namedef show(self):print(f"装扮的{self.name}")# 服饰抽象类
class Finery(ABC):@abstractmethoddef show(self):pass# 具体服饰类
class TShirts(Finery):def show(self):print("大T恤 ", end="")class BigTrouser(Finery):def show(self):print("垮裤 ", end="")class Sneakers(Finery):def show(self):print("破球鞋 ", end="")class Suit(Finery):def show(self):print("西装 ", end="")class Tie(Finery):def show(self):print("领带 ", end="")class LeatherShoes(Finery):def show(self):print("皮鞋 ", end="")# 客户端代码
if __name__ == "__main__":xc = Person("小菜")print("\n第一种装扮:")dtx = TShirts()kk = BigTrouser()pgx = Sneakers()dtx.show()kk.show()pgx.show()xc.show()print("\n第二种装扮:")xz = Suit()ld = Tie()px = LeatherShoes()xz.show()ld.show()px.show()xc.show()

建造者模式过程必须稳定,而这里建造过程不稳定,可以先传西装,外套,也可以反过来。

3. 第三版

装饰模式
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

from abc import ABC, abstractmethod# Person类 (ConcreteComponent)
class Person:def __init__(self, name):self.name = namedef show(self):print(f"装扮的{self.name}")# 服饰抽象类 (Decorator)
class Finery(Person):def __init__(self):self._component = None# 打扮/装饰方法def decorate(self, component):self._component = componentdef show(self):if self._component:self._component.show()# 具体服饰类 (ConcreteDecorator)
class TShirts(Finery):def show(self):print("大T恤 ", end="")super().show()class BigTrouser(Finery):def show(self):print("垮裤 ", end="")super().show()class Sneakers(Finery):def show(self):print("破球鞋 ", end="")super().show()class Suit(Finery):def show(self):print("西装 ", end="")super().show()class Tie(Finery):def show(self):print("领带 ", end="")super().show()class LeatherShoes(Finery):def show(self):print("皮鞋 ", end="")super().show()# 客户端代码
if __name__ == "__main__":xc = Person("小菜")print("\n第一种装扮:")pqx = Sneakers()kk = BigTrouser()dtx = TShirts()pqx.decorate(xc)    # 装饰过程kk.decorate(pqx)dtx.decorate(kk)dtx.show()print("\n第二种装扮:")px = LeatherShoes()ld = Tie()xz = Suit()px.decorate(xc)     # 装饰过程ld.decorate(px)xz.decorate(ld)xz.show()input()  # 相当于C#的Console.Read()
http://www.lryc.cn/news/573288.html

相关文章:

  • 算法导论第二十四章 深度学习前沿:从序列建模到创造式AI
  • MySQL之InnoDB存储引擎深度解析
  • 深度剖析 PACK_SESSIONID 实现原理与安全突破机制
  • 【环境配置】在Ubuntu Server上安装5090 PyTorch环境
  • Kubernetes控制平面组件:Kubelet详解(八):容器存储接口 CSI
  • 项目中后端如何处理异常?
  • 数据分析实操篇:京东淘宝商品实时数据获取与分析
  • Python 的内置函数 hash
  • NVIDIA cuFFTDx文档笔记
  • 资产设备管理系统,Java + Vue,移动端+后台管理,实现设备全生命周期信息精准管控与高效运维
  • Windows/Linux系统 Ollama部署deepseek 大模型
  • 面试题-定义一个函数入参数是any类型,返回值是string类型,如何写出这个函数,代码示例
  • 跨标签页通信(三):Web Storage
  • C# WPF常用调试工具汇总
  • 如何定时发布WordPress文章(多种方法)
  • 【Redis】深入理解 Redis 事务:命令、应用与实战案例
  • CertiK联创顾荣辉将于港大活动发表演讲,分享Web3安全与发展新视角
  • C#测试调用ClosedXML根据批注设置excel单元格内容
  • 企业公用电脑登录安全管控的终极方案:ASP操作系统安全登录管控方案
  • 亚马逊认证考试系列 - 第一部份:基础服务 - AWS SAA C03
  • 客户端面经
  • 决策树:化繁为简的智能决策利器
  • 【Kubernetes】从零搭建K8s集群:虚拟机环境配置全指南(DNS/网络/防火墙/SELinux全解析一站式配置图文教程)
  • 题解:P11501 [ROIR 2019] 探险队(Day 2)
  • FPGA四十年创新:因仿真加速而生,AI加速而盛!
  • 【RTP】基于mediasoup的RtpPacket的H.264打包、解包和demo 2:含扩展
  • 11.RSTP快速生成树协议深度剖析:结合华为eNSP模拟器的完整实验方案
  • 为什么要BRE
  • LLM-201: OpenHands与LLM交互链路分析
  • 【基础算法】二分(二分查找 + 二分答案)