设计模式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.rhkb.cn/news/258581.html

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

相关文章

Netty中的适配器、Handler共享和资源管理

ChannelHandler的适配器 有一些适配器类可以将编写自定义的ChannelHandler所需要的工作降到最低限度, 因为它们提供了定义在对应接口中的所有方法的默认实现。因为有时会忽略那些不感兴趣的 事件,所以Netty提供了抽象积累ChannelInboundHandlerAdapter(…

云计算基础-虚拟机迁移原理

什么是虚拟机迁移 虚拟机迁移是指将正在运行的虚拟机实例从一个物理服务器(或主机)迁移到另一个物理服务器(或主机)的过程,而不会中断虚拟机的运行。 虚拟机拟机迁移分类虚 热迁移:开机状态下迁移 冷迁…

计算机毕业设计SSM基于的高校学习资源共享系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: vue mybatis Maven mysql5.7或8.0等等组成,B…

深入学习Pandas:数据连接、合并、加入、添加、重构函数的全面指南【第72篇—python:数据连接】

深入学习Pandas:数据连接、合并、加入、添加、重构函数的全面指南 Pandas是Python中最强大且广泛使用的数据处理库之一,提供了丰富的函数和工具,以便更轻松地处理和分析数据。在本文中,我们将深入探讨Pandas中一系列数据连接、合…

LabVIEW开发DUP实时监控系统

LabVIEW开发DUP实时监控系统 该项目采用虚拟仪器设计理念,以LabVIEW作为核心技术平台,开发了一套磁控溅射过程的实时监控系统。实现过程中关键参数的全面数据采集与处理,建立完整的历史数据库,以支持涂层技术的改进和系统向模糊控…

Python算法题集_LRU 缓存

Python算法题集_LRU 缓存 题146:LRU 缓存1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【队列字典】2) 改进版一【有序字典】3) 改进版二【双向链表字典】 4. 最优算法 本文为Python算法题集之一的代码示例 题146:LRU …

论文阅读:《Deep Learning-Based Human Pose Estimation: A Survey》——Part 1:2D HPE

目录 人体姿态识别概述 论文框架 HPE分类 人体建模模型 二维单人姿态估计 回归方法 目前发展 优化 基于热图的方法 基于CNN的几个网络 利用身体结构信息提供构建HPE网络 视频序列中的人体姿态估计 2D多人姿态识别 方法 自上而下 自下而上 2D HPE 总结 数据集…

前端小案例——购买电影票(HTML+CSS+JS, 附源码)

一、前言 实现功能: 这段代码实现了一个简单的电影票选座购买的功能界面。 在页面上展示了一个电影院的座位布局,以及右侧显示了电影信息、选座情况、票价、总计等内容。 用户可以通过点击座位来选择购买电影票,每个座位的状态会在点击时改…

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

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

《小强升职记:时间管理故事书》阅读笔记

目录 前言 一、你的时间都去哪儿了 1.1 你真的很忙吗 1.2 如何记录和分析时间日志 1.3 如何找到自己的价值观 二、无压工作法 2.1 传说中的“四象限法则 2.2 衣柜整理法 三、行动时遇到问题怎么办? 3.1 臣服与拖延 3.2 如何做到要事第一? 3.…

[OPEN SQL] 更新数据

UPDATE语句用于更新数据库表中的数据 本次操作使用的数据库表为SCUSTOM&#xff0c;其字段内容如下所示 航班用户(SCUSTOM) 需要操作更新以下数据 1.更新单条数据 语法格式 UPDATE <dbtab> FROM <wa>. UPDATE <dbtab> FROM TABLE <itab>. UPDATE &l…

Github 2024-02-17 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-17统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目3Rust项目2Jupyter Notebook项目1PowerShell项目1JavaScript项目1 Black&#xff…

【C++ STL】你真的了解string吗?浅谈string的底层实现

文章目录 底层结构概述扩容机制浅拷贝与深拷贝插入和删除的效率浅谈VS和g的优化总结 底层结构概述 string可以帮助我们很好地管理字符串&#xff0c;但是你真的了解她吗&#xff1f;事实上&#xff0c;string的设计是非常复杂的&#xff0c;拥有上百个接口&#xff0c;但最常用…

力扣题目训练(12)

2024年2月5日力扣题目训练 2024年2月5日力扣题目训练476. 数字的补数482. 密钥格式化485. 最大连续 1 的个数148. 排序链表164. 最大间距 2024年2月5日力扣题目训练 2024年2月5日第十二天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包括简单题3道、中等题2道和…

下一代Windows系统曝光:基于GPT-4V,Agent跨应用调度,代号UFO

下一代Windows操作系统提前曝光了&#xff1f;&#xff1f; 微软首个为Windows而设的智能体&#xff08;Agent&#xff09; 亮相&#xff1a; 基于GPT-4V&#xff0c;一句话就可以在多个应用中无缝切换&#xff0c;完成复杂任务。整个过程无需人为干预&#xff0c;其执行成功…

【java苍穹外卖项目实战一】苍穹外卖项目介绍

文章目录 1、项目介绍1、项目概述2、 产品原型3、技术选型 1、项目介绍 在开发苍穹外卖这个项目之前&#xff0c;我们需要全方位的来介绍一下当前我们学习的这个项目。接下来&#xff0c;我们将从项目简介、产品原型、技术选型三个方面来介绍苍穹外卖这个项目。 1、项目概述 …

支付交易——跨境交易

摘要 老王兢兢业业经营生意多年&#xff0c;一步步从小杂货店做到现在&#xff0c;成立大型贸易公司。在做大做强的过程中&#xff0c;老王觉得国内市场已经饱和&#xff0c;竞争处处是红海。老王留意海外很多年了&#xff0c;决定走出去&#xff0c;转向海外:将国外的商品引进…

【国产MCU】-CH32V307-基本定时器(BCTM)

基本定时器(BCTM) 文章目录 基本定时器(BCTM)1、基本定时器(BCTM)介绍2、基本定时器驱动API介绍3、基本定时器使用实例CH32V307的基本定时器模块包含一个16 位可自动重装的定时器(TIM6和TIM7),用于计数和在更新新事件产生中断或DMA 请求。 本文将详细介绍如何使用CH32…

数学建模【线性规划】

一、线性规划简介 线性规划通俗讲就是“有限的资源中获取最大的收益”&#xff08;优化类问题&#xff09;。而且所有的变量关系式都是线性的&#xff0c;不存在x、指数函数、对数函数、反比例函数、三角函数等。此模型要优化的就是在一组线性约束条件下&#xff0c;求线性目标…

【c++】list详细讲解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉list库 > 毒鸡汤&#xff1a;你的脸上云淡…