设计模式Python实现

过年在家瞎折腾,闲着无聊看到设计模式,于是就想着用Python实现一下。

简单工厂

根据传入的参数决定创建出哪一种产品类的实例。

class CashFactory:def createCashAdapter(self, type):if type == "满100减20":return CashReturn(100, 20)elif type == "打八折":return CashRebate(0.8)else:return CashNormal()class CashSuper(object):def __init__(self):pass@abstractmethoddef acceptCash(self, money):passclass CashNormal(CashSuper):def acceptCash(self, money):return moneyclass CashRebate(CashSuper):rebate = 1def __init__(self, rebate):self.rebate = rebatesuper().__init__()def acceptCash(self, money):return self.rebate * moneyclass CashReturn(CashSuper):moneyCondition = 0moneyReturn = 0def __init__(self, moneyCondition, moneyReturn):self.moneyCondition = moneyConditionself.moneyReturn = moneyReturnsuper().__init__()def acceptCash(self, money):ret = moneyif money >= self.moneyCondition:ret = money - math.floor(money / self.moneyCondition) * self.moneyReturnreturn ret# 调用工厂
cashFactory = CashFactory()
cashSuper = cashFactory.createCashAdapter(comboValue.get())
result = cashSuper.acceptCash(money)

策略模式

定义一系列算法,所有算法完成相同的工作,实现不同,减少算法间的耦合,由Context确定具体算法,侧重算法的封装。

# context
class CashContext:cashSuper = Nonedef __init__(self, type):if type == "满100减20":self.cashSuper = CashReturn(100, 20)elif type == "打八折":self.cashSuper = CashRebate(0.8)else:self.cashSuper = CashNormal()def getResult(self, money):return self.cashSuper.acceptCash(money)# 调用context
cashContext = CashContext(comboValue.get())
result = cashContext.getResult(money)

代理模式

为其他对象提供一种代理以控制这个对象的访问

# 被代理类
class RealSubject(Subject):def request(self):print('调用实际方法')# 代理类
class Proxy(Subject):def __init__(self):super().__init__()self.realSubject = RealSubject()def request(self):self.preRequest()self.realSubject.request()self.postRequest()def preRequest(self):print("调用方法之前")def postRequest(self):print("调用方法之后")

原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建对象。

# 使用Python的copy包来实现深拷贝和浅拷贝
class Prototype(object):def __init__(self):print('创建成功')def clone(self):clone = copy.deepcopy(self)return clonep1 = Prototype()
p2 = p1.clone()

模板方法模式

某一细节上的一系列过程或者一系列步骤,在个别步骤上实现不同时考虑模板方法。

# 抽象类,包含骨架和组成步骤
class AbstractClass(object):def template_method(self):self.specific_method()self.abstract_method()def specific_method(self):print("调用方法")@abstractmethoddef abstract_method(self):raise ValueError('请实现方法')# 具体方法
class ConcreteClass(AbstractClass):def abstract_method(self):print("Abstract实现")# 调用
tm = ConcreteClass()
tm.template_method()

装饰模式

动态给一个对象添加一些额外的职责。

# 抽象接口
class Component(object):@abstractmethoddef operation(self):raise ValueError('请实现方法')# 装饰抽象类
class Decorator(object):def __init__(self, component):self.component = componentdef operation(self):self.component.operation()class ConcreteDecorator(Decorator):def __init__(self, component):Decorator.__init__(self, component)def operation(self):Decorator.operation(self)self.addedFunction()def addedFunction(self):print('addedFunction')class ConcreteComponent(Component):def __init__(self):print('创建具体构建对象')def operation(self):print('调用构建对象方法')p = ConcreteComponent()
p.operation()
print('---')d = ConcreteDecorator(p)
d.operation()

外观模式

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口。

# 外观类
class Facade(object):def __init__(self):self.sys1 = Subsystem001()self.sys2 = Subsystem002()self.sys3 = Subsystem003()def method(self):self.sys1.method()self.sys2.method()self.sys3.method()class Subsystem001(object):def method(self):print('子系统1调用')class Subsystem002(object):def method(self):print('子系统2调用')class Subsystem003(object):def method(self):print('子系统3调用')facade = Facade()
facade.method()

观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

class Observer(object):@abstractmethoddef response(self):passclass Subject(object):def __init__(self):self.observers = []def add_observer(self, observer):self.observers.append(observer)def remove_observer(self, observer):self.observers.remove(observer)@abstractmethoddef notify_observers(self):passclass ConcreteSubject(Subject):def notify_observers(self):print('观察目标改变')print('----------')for observer in self.observers:observer.response()class ConcreteObserver1(Observer):def response(self):print('观察者1变化')class ConcreteObserver2(Observer):def response(self):print('观察者2变化')subject = ConcreteSubject()
obs1 = ConcreteObserver1()
obs2 = ConcreteObserver2()
subject.add_observer(obs1)
subject.add_observer(obs2)
subject.notify_observers()

状态模式

当对象状态改变时允许改变其行为,这个对象看起来像是改变了其类。解决当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列的类中。

class State:@abstractmethoddef handle(self):raise ValueError('请实现方法')class ConcreteState(State):def handle(self, context):print('当前状态A')context.setState(ConcreteState2())class ConcreteState2(State):def handle(self, context):print('当前状态B')context.setState(ConcreteState3())class Context(object):def __init__(self):self.state = ConcreteState()def setState(self, state):self.state = statedef getState(self):return self.statedef handle(self):self.state.handle(self)context = Context()
context.handle()
context.handle()

适配器模式

将一个类的接口转换成客户希望的另一种接口

class Target(object):@abstractmethoddef request(self):passclass Adapter:def __init__(self):passdef specificRequest(self):print('适配者业务被调用')class ClassAdapter(Adapter):def request(self):self.specificRequest()classAdapter = ClassAdapter()
classAdapter.request()

桥接模式

将抽象部分与它的实现部分分离,是他们都可以独立地变化

class Abstract(object):def __init__(self, imple):self.imple = imple@abstractmethoddef operation(self):passclass RefinedAbstraction(Abstract):def __init__(self,imple):super(RefinedAbstraction,self).__init__(imple)def operation(self):print('扩展抽象角色被访问')self.imple.opreationImpl()class Implementor(object):@abstractmethoddef opreationImpl(self):passclass ConcreteImplementor(Implementor):def opreationImpl(self):print('实现类角色被访问')imple = ConcreteImplementor()
abs = RefinedAbstraction(imple)
abs.operation()

命令模式

将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化。

class Command(object):@abstractmethoddef execute(self):raise ValueError('请实现方法')class ConcreateCommand(Command):def __init__(self):self.receiver = Receiver()def execute(self):self.receiver.action()class Invoker(object):def __init__(self, command):self.command = commanddef call(self):print('调用者执行命令')self.command.execute()class Receiver:def action(self):print('接收者执行命令')cmd = ConcreateCommand()
ir = Invoker(cmd)
print('客户端发送命令开始')
ir.call()

责任链模式

如果有多个对象有机会处理请求,责任链可使请求的发送者和接受者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。

class Handler(object):def __init__(self):self.next = Nonedef setNext(self, next):self.next = nextdef getNext(self):return self.next@abstractmethoddef handleRequest(self, request):raise ValueError('请实现方法')class ConcreteHandler1(Handler):def handleRequest(self, request):if request == "one":print('处理者1处理')else:if self.getNext() is not None:self.getNext().handleRequest(request)else:print('处理完成')class ConcreteHandler2(Handler):def handleRequest(self, request):if request == "two":print('处理者2处理')else:if self.getNext() is not None:self.getNext().handleRequest(request)else:print('处理完成')handler1 = ConcreteHandler1()
handler2 = ConcreteHandler2()
handler1.setNext(handler2)
handler1.handleRequest("two")

中介者模式

定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互

class Mediator(object):@abstractmethoddef register(self, colleague):raise ValueError('请实现方法')@abstractmethoddef relay(self, colleague):raise ValueError('请实现方法')class ConcreteMediator(Mediator):colleagues = []def register(self, colleague):if not self.colleagues.__contains__(colleague):self.colleagues.append(colleague)colleague.set_mediator(self)def relay(self, colleague):for ob in self.colleagues:if ob != colleague:ob.receive()class ConcreteColleague1(Colleague):def receive(self):print("具体类收到请求1")def send(self):print('具体类发送请求1')self.mediator.relay(self)class ConcreteColleague2(Colleague):def receive(self):print("具体类收到请求2")def send(self):print('具体类发送请求2')self.mediator.relay(self)class Colleague(object):def __init__(self):self.mediator = Nonedef set_mediator(self, mediator):self.mediator = mediatordef get_mediator(self):return self.mediator@abstractmethoddef receive(self):raise ValueError('请实现方法')@abstractmethoddef send(self):raise ValueError('请实现方法')md = ConcreteMediator()
c1 = ConcreteColleague1()
c2 = ConcreteColleague2()
md.register(c1)
md.register(c2)
c1.send()
print('----------------')
c2.send()

享元模式

通过共享的方式高效的支持大量细粒度的对象。

class Flyweight:@abstractmethoddef operation(self, unshared):passclass ConcreteFlyweight(Flyweight):def __init__(self, key):self.key = keyprint('享元' + key + '被创建')def operation(self, unshared):print('享元' + self.key)print('非享元' + unshared.get_info())class FlyweightFactory(object):_flyweights = {}def get_flyweight(self, key):if not self._flyweights.get(key):self._flyweights[key] = ConcreteFlyweight(key)return self._flyweights[key]class UnsharedConcreteFlyweight:def __init__(self, info):self.info = infodef get_info(self):return self.infodef set_info(self, info):self.info = infofactory = FlyweightFactory()
f01 = factory.get_flyweight('a')
f02 = factory.get_flyweight('a')
f03 = factory.get_flyweight('b')
f04 = factory.get_flyweight('b')
f01.operation(UnsharedConcreteFlyweight('第1次调用a'))
f01.operation(UnsharedConcreteFlyweight('第2次调用a'))

访问者模式

将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离。

class Memento(object):def __init__(self, state):self._state = statedef setState(self, state):self._state = statedef getState(self):return self._stateclass Caretaker:def __init__(self):self._memento = Nonedef setMemento(self, memento):self._memento = mementodef getMemento(self):return self._mementoclass Originator:def __init__(self):self._state = Nonedef setState(self, state):self._state = statedef getState(self):return self._statedef createMemento(self):return Memento(self._state)def restoreMemento(self, memento):self.setState(memento.getState())

完整代码点击这里码云

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

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

相关文章

Sora爆火,普通人的10个赚钱机会

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

spring boot自动装配

第一步需要在pom.xml文件指定需要导入的坐标 要是没有自动提示需要检查maven有没有 实现代码 /*springboot第三方自动配置实现方法 * 什么是自动配置 自动配置就是springboot启动自动加载的类不需要在手动的控制反转自动的加入bean中 * * *//*第一种方案包扫描 不推荐因为繁琐…

2024 VNCTF----misc---sqlshark sql盲注+流量分析

流量分析 wireshark 可以看到很多 any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(80))),1,0))# P any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(104))),1,0))#…

18-k8s控制器资源-cronjob控制器

job控制器是执行完一次任务,就结束; cronjob控制器,是基于job控制器,定期频率性执行任务;等同于linux系统中的crontab一样; 1,编辑cronjob资源清单 [rootk8s231 pi]# vim cronjob.yaml apiVers…

mfc140u.dll文丢失导致应用程序无法正常,有哪些解决办法

mfc140u.dll是Microsoft Foundation Classes(MFC)的一个重要组件,它提供了许多用于开发Windows应用程序的功能和工具。然而,当系统或应用程序升级、恶意软件感染或文件损坏以及用户错误操作等情况发生时,mfc140u.dll文…

HarmonyOS—状态管理概述

在前文的描述中,我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面,就需要引入“状态”的概念。 图1 效果图 上面的示例中,用户与应用程序的交互触发了文本状态变更,状态变更引起了UI渲染,UI从“He…

【OrangePi Zero2的系统移植】嵌入式Linux系统的组成、编译u-boot、编译内核、Linux根文件系统

一、嵌入式Linux系统的组成 二、编译u-boot 三、编译内核 四、Linux根文件系统 一、嵌入式Linux系统的组成 嵌入式Linux系统和PC完整的操作系统的对比如下: BIOS和UEFI的作用: a. 进行硬件自检,检测内存,CPU,显卡&a…

使用LlamaIndex和ChatGPT的无代码检索增强生成(RAG)

自从ChatGPT和类似的LLM推出以来,出现了大量的RAG工具和库。人们需要了解如何使用LlamaIndex和ChatGPT的无代码RAG。 检索增强生成(RAG)是使用大型语言模型(LLM)的关键工具。RAG使LLM能够将外部文档合并到它们的响应中,从而更紧密地与用户需求保持一致。…

Servlet要点总结

一、什么是 Servlet Servlet 在开发动态 WEB 工程中,得到广泛的应用,掌握好 Servlet 非常重要了 , Servlet( 基 石 ) 是 SpringMVC 的基础 Servlet(java 服务器小程序 ) ,它的特点 : 1. 他是由服务器端调用和执行的 ( 一句话&…

RTC时钟

目录 一、STM32F407内部RTC硬件框图,主要由五大部分组成: 二、硬件相关引脚 三、具体代码设置步骤 四、了解其它知识点 一、STM32F407内部RTC硬件框图,主要由五大部分组成: ① 时钟源 (1)LSE:一般我们选择 LSE&am…

【EI稳定检索会议】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

#往届均已成功检索# 投稿时邀请码请填H8053 第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024) 2024 5th International Conference on Big Data & Artificial Intelligence & Software Engineering 2024年09月20-22日 | 中国温州 &g…

16.Qt 工具栏生成

目录 前言: 技能: 内容: 1. 界面添加 2. 信号槽 功能实现 参考: 前言: 基于QMainWindow,生成菜单下面的工具栏,可以当作菜单功能的快捷键,也可以完成新的功能 直接在UI文件中…

Java并发基础:ConcurrentSkipListSet全面解析!

内容概要 ConcurrentSkipListSet类在多线程环境下,它能够轻松应对大量的插入、删除和查找操作,同时保持数据的完整性和一致性,其内部基于跳表数据结构的实现,确保了即使在处理大规模数据时,也能具有出色的性能表现。 …

第二篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:深度解读pyttsx3支持多种语音引擎

传奇开心果短博文系列 系列短博文目录Python的文本和语音相互转换库技术点案例示例系列 短博文目录前言一、三种语音引擎支持介绍和示例代码二、SAPI5引擎适用场景介绍和示例代码三、nsss引擎适用场景介绍和示例代码四、eSpeak适用场景介绍和示例代码五、归纳总结 系列短博文目…

计算机丢失mfc140.dll怎么安装?多种方法轻松搞定mfc140.dll问题

​Mfc140.dll文件的丢失可能会引发一系列系统运行问题。作为Microsoft Visual C Redistributable Package的重要组成部分,Mfc140.dll在许多应用程序的正常运行中扮演着关键角色。当这个动态链接库文件缺失时,可能会导致软件启动失败、运行不稳定、功能受…

.NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库

一、效果 记录日志为文档 记录日志到数据库 二、添加NuGet包 三、log4net.config代码配置 <?xml version"1.0" encoding"utf-8" ?> <log4net><!-- Debug日志 --><appender name"RollingFileDebug" type"log4net…

林浩然与杨凌芸的Java集合奇遇记

林浩然与杨凌芸的Java集合奇遇记 The Java Collection Chronicles of Lin Haoran and Yang Lingyun 在一个充满代码香气的午后&#xff0c;程序员男主角林浩然正在他的编程世界里挥舞着键盘剑&#xff0c;探索Java王国中的神秘宝藏——集合。而我们的女主角杨凌芸&#xff0c;作…

基于Spring Boot的协力服装厂服装生产管理系统,计算机毕业设计(带源码+论文)

源码获取地址&#xff1a; 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1759135037462228993

缩小ppt文件大小的办法

之前用别人模版做了个PPT&#xff0c;100多M,文件存在卡顿问题 解决办法&#xff1a; 1.找到ppt中哪个文件过大&#xff0c;针对解决 2.寻找视频/音频文件&#xff0c;减少体积 3.字体文件是不是过多的问题。 一、文件寻找的内容步骤&#xff1a; 步骤&#xff1a; 1.把p…

在beforeUpdate中调用了请求数据接口,修改了初始数据造成死循环

在beforeUpdate中调用了请求数据接口&#xff0c;修改了初始数据造成死循环 问题&#xff1a; 不要在beforeUpdate和updated中更改数据&#xff0c;会造成死循环&#xff1b; 原因&#xff1a; 当数据更改就会走这个钩子&#xff0c;而你在里面进行数据更改又会走这个钩子&…