设计模式之美
程序员的战歌
会删库,但不会跑路。
展开
-
设计模式与原则
设计模式设计模式共分为三大类,细分为23种设计模式。三大类创建型模式,提供实例化的方法,为适合的状况提供相应的对象创建方法。结构型模式,通常用来处理实体之间的关系,使得这些实体能够更好地协同工作。行为型模式,用于在不同的实体建进行通信,为实体之间的通信提供更容易,更灵活的通信方法。细分创建型1. Factory Method(工厂方法)2. Abstract Factory(抽象工厂)3. Builder(建造者)4. Prototype(原型)5.原创 2021-08-03 18:55:23 · 52 阅读 · 0 评论 -
单例模式-Python实现
单例模式场景单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样原创 2021-08-03 19:02:50 · 80 阅读 · 0 评论 -
工厂模式-Python实现
工厂模式工厂模式是一个在软件开发中用来创建对象的设计模式。工厂模式,顾名思义就是我们可以通过一个指定的“工厂”获得需要的“产品”,在设计模式中主要用于抽象对象的创建过程,让用户可以指定自己想要的对象而不必关心对象的实例化过程。好处是用户只需通过固定的接口而不是直接去调用类的实例化方法来获得一个对象的实例,隐藏了实例创建过程的复杂度,解耦了生产实例和使用实例的代码,降低了维护的复杂性。基于工厂模式实现的代码,可扩展、可维护性更好。场景1.当你不知道用哪个类去创建这个类的时候。原创 2021-08-03 19:29:56 · 257 阅读 · 0 评论 -
建造者模式-Python实现
建造者模式场景一些基本部件不会变,而其组合经常变化的时候。例如,去肯德基,汉堡、薯条、可乐、鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。另一个场景,在游戏软件中,地图包括天空、地面、背景等组成部分,人物角色包括人体、服装、装备等组成部分,都可以使用建造者模式对其进行设计,通过不同的具体建造者创建不同类型的地图或人物。还有一个场景,就是操作数据库的orm。orm中一个很重要的概念:延迟加载,其实就是建造者模式最常见的应用。在一开始将orm对象构造出来,但并不实际原创 2021-08-05 15:54:04 · 103 阅读 · 0 评论 -
原型模式-Python实现
原型模式原型模式关注的是大量相同对象或相似对象的创建问题,意图在于通过复制一个已经存在的实例来获得一个新的实例,以避免重复创建此类实例带来的开销。被复制的实例就是这个“原型”,这个原型是可定制的。场景当我们已经存在一个对象,这个对象有其属性和方法,若我们还想去获得另外一个同类型对象,此时有两种选择:重新去创建一个新的对象,或者根据已有的对象复制一个副本。而在很多时候我们不需要完全去重新构建一个对象,只需要在原有对象存在的基础上(保留原对象),去修改其属性和方法得到一个新的对象。实原创 2021-08-05 16:11:43 · 170 阅读 · 0 评论 -
适配器模式-Python实现
适配器模式定义将一个类的接口变换成客户端期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。场景你想使用一个已经存在的类,但它的接口不符合你的需求。不修改现存的接口,要使该接口适用或兼容新场景业务中,适合使用适配器模式。适配器可以认为是对现存业务的补偿式应用,所以尽量不要在设计阶段使用适配器模式,在两个系统需要兼容时可以考虑使用适配器模式。适配器模式与装饰模式适配器模式和装饰模式有一定的相似性,都起包装的作用,但二者本质上又是不同的,装原创 2021-08-04 11:16:53 · 123 阅读 · 0 评论 -
桥接模式-Python实现
桥接模式定义桥接模式(Bridge Pattern):将抽象部分与它的实现部分解耦,使它们都可以独立地变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。场景系统可能有多个维度分类,每一种维度都可能变化。在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。原创 2021-08-06 09:44:23 · 317 阅读 · 0 评论 -
组合模式-Python实现
组合模式定义组合模式(Composite Pattern):将对象组合成树形结构,以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。场景在需要体现部分与整体层次的结构时。希望用户忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时。例如描述一家公司的层次结构,那么我们用部门来表示节点,则总经理部门是根节点,下面分别由人事部门、业务部门、生产部门、财务办部门,每个部门下面可以还有更小的部门,每个部门都有职责、人员数、人员薪资等属性。原创 2021-08-05 15:47:46 · 305 阅读 · 0 评论 -
外观模式-Python实现
外观模式外观模式又叫做门面模式。外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个可以访问系统的接口。外观模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。场景在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改原创 2021-08-05 15:50:28 · 180 阅读 · 0 评论 -
享元模式-Python实现
享元模式定义享元模式是一种用于解决资源和性能压力时会使用到的设计模式,它的核心思想是通过引入数据共享来提升性能。场景例如,在开发3D游戏时,例如有成千上万的士兵或者有成千上万棵树,如果一个3D地带的每个对象都单独创建,不使用数据共享,那么性能是无法接受的。既然要创建成千上万棵树,那么若他们的数据属性行为都是一样的,那岂不是黏一块去了。这时候就会有:可变数据和不可变数据的概念。创建相同类型的对象时,共享不可变的数据,而每个对象又有其独立的数据--可变的数据(不可共享数据),原创 2021-08-06 11:23:49 · 150 阅读 · 0 评论 -
代理模式-Python实现
代理模式定义代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。场景在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。例如,西门大官人想要和潘金莲happy,但是不能太光明正大,所以就让王婆做中间代理。实现以西门大官人、潘金莲、王婆的故事做例子,讲解代理模式的实现。# 抽象类,女人类,定义女人的行为class Female(object): # 和男人抛媚眼原创 2021-08-06 16:12:00 · 312 阅读 · 0 评论 -
解释器模式-Python实现
解释器模式解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。场景例如:将“1+2+3-4”等字符串输入到Python的console,但是本身Python不认识这些字符串,就需要定义的一套文法规则来解释这些字符串,也就是设计一个自定义语言。例如,SQL 解析、符号处理。例如,同一份乐谱,用钢琴、小提琴分别解释会得到不同的音乐。实现就用同一份乐谱,分别用钢琴和小提琴来演奏,看原创 2021-08-06 18:33:41 · 304 阅读 · 0 评论 -
模板方法模式-Python实现
模板方法模式定义模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式 是一种基于继承的代码复用技术 ,将一些复杂流程的实现步骤封装在一系列基本方法中 ,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。场景例如,员工每天的行程基本都是一致的,上班-工作-午休-工作-下班,唯有工作中的工作内容是不一原创 2021-08-10 19:18:25 · 61 阅读 · 0 评论 -
责任链模式-Python实现
责任链模式定义使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。场景预先不知道由哪个对象来处理某种特定请求时。让多个对象处理一个请求时。例如公司请假系统,员工请假3天以内(包括3天),只要直属经理批准即可;如果请假3-7天,不仅要直属经理批准,还要部门经理最终批准;如果请假大于7天,不仅要前两个经理批准,还要总经理最终批准。实现用责任链实现上面的公司请假系统原创 2021-08-10 19:20:15 · 149 阅读 · 0 评论 -
命令模式-Python实现
命令模式场景“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现“行为请求者”与“行为实现者”的松耦合。这就是命令模式(Command Pattern)模式的结构Command(命令基类):定义命令的接口,声明执行的方法,可以理解为一个基类。ConcreteCommand(命令实现):命原创 2021-08-05 16:29:26 · 128 阅读 · 0 评论 -
迭代器模式-Python实现
迭代器模式迭代器模式,提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示什么是迭代?使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程。可迭代对象使用for循环遍历取值的对象叫做可迭代对象, 比如:列表、元组、字典、集合、range、字符串迭代器,实际上就是一个可迭代对象。场景迭代器与列表的区别在于,构建迭代器的时候,不需要把所有元素一次性加载到内存,而是以一种延迟计算方式返回元素。如果列表包含1000万个整数原创 2021-08-03 19:49:35 · 135 阅读 · 0 评论 -
中介者模式-Python实现
中介者模式定义中介者模式(Mediator Pattern):用一个对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使耦合松散,而且可以独立地改变它们之间的交互。场景当有多个对象彼此间相互交互,对象间的耦合度过高的场合。想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。实现class Consumer: def __init__(self, product, price): self.name = "消费者"原创 2021-08-10 19:22:10 · 253 阅读 · 0 评论 -
备忘录模式-Python实现
备忘录模式定义备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态。场景例如,大多单机版游戏都有保存进度的功能,比如你玩到第5关,就可以将进度保存到第5关,下次就会从第6关开始,尽管你一直过不了第6关,也没关系,并不会从第一关重头开始。备忘录就可以将进度保存起来,下次进入的时候,从备忘录中加载最新进度。实现用备忘录模式演示:先做些事情,然后保存进度,然后再做些修改,最后再原创 2021-08-10 19:23:58 · 369 阅读 · 0 评论 -
观察者模式-Python实现
观察者模式定义观察者模式(发布-订阅模式 Publish Subscribe Pattern):定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者,使它们能够自动更新自己。简单就是说你有一个观察者列表,这个列表中的函数或者某种功能都在观察某个事件的发生,一旦发生,这些函数或者功能就会自动执行。场景例如,员工趁老板不在,都在玩自己的东西,同时观察着前台小姐姐,前台小姐姐在老板回来的时候,发布通知让各同事回到工作状态。实现没有原创 2021-08-10 19:26:46 · 222 阅读 · 0 评论 -
状态模式-Python实现
状态模式定义状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,即不同的状态对应了不同的行为。对象看起来似乎修改了它的类。很多情况下,一个对象的行为取决于一个或者多个动态变化的属性。这样的属性叫做状态,这样的对象叫做有状态的对象。其状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之改变。场景对象的行为依赖于它的状态(例如某些属性值),状态的改变将导致行为的变化 。在代码中包含大量与原创 2021-08-10 19:29:12 · 267 阅读 · 0 评论 -
策略模式-Python实现
策略模式场景是否每次看到项目中存在大量的if else代码时,都会没有安全感。如果新写一个功能要添加一条if else语句,就不得不仔细查看一遍之前存在的if else语句。如果if else语句有很多,不说上百条,几十条if else语句,改一下都要绷紧神经。策略模式是什么?策略模式定义一系列算法,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。定义是否索然无味?来看例子:超市搞活动给客户派送了一批优惠券,优惠券分三种:原创 2021-08-03 19:20:49 · 177 阅读 · 0 评论 -
访问者模式-Python实现
访问者模式定义封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。场景1.对象结构比较稳定,但经常需要在此对象结构上定义新的操作。2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。实现假设一个药房,有一些大夫,一个药品收银员和一个药房管理员,它们通过一个药房管理系统组织工作流程。大夫开出药方后,药品收银员确定药品是否正常,价格是否原创 2021-08-10 19:31:36 · 160 阅读 · 0 评论