设计模式
编程是门艺术,代码无错未必优,大批量的改动是非常丑陋的做法。
K5niper
这个作者很懒,什么都没留下…
展开
-
大话设计模式:UML类图
UML类图类图(例如:动物):类(class)用矩形框表示,类图分三层,第一层是类名,如果是抽象类,则用斜体显示;第二层是类的特性,通常是字段和属性;第三层是类的操作,通常是方法或行为。前置符号:+表示public;-表示private;#表示protected。接口图(例如:飞翔):接口(interface)用矩形框表示,接口图分两层,第一层是接口名,顶端有<<interfa...原创 2020-04-30 10:13:56 · 483 阅读 · 0 评论 -
设计模式摘要
设计模式摘要设计模式(Design pattern)代表了最佳工程实践,是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式的六大原则开闭原则(Open Close Principle)开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。...原创 2020-04-28 15:58:05 · 239 阅读 · 0 评论 -
大话设计模式:第29章 模式总结
第29章:模式总结松耦合内聚性描述的是一个例程内部组成部分之间相互联系的紧密程度。耦合性描述的是一个例程与其他例程之间联系的紧密程度。软件开发中,创建的例程应该是:内部完整,也就是高内聚;与其他例程之间的联系则小巧、直接、可见、灵活,这就是松耦合。面向对象在做面向对象的开发,创建对象的工作不可避免。创建对象时,负责创建的实体通常需要了解要创建的是哪个具体的对象,以及何时创建这个而非那个对象的规则。而我们如果希望遵循开放-封闭原则、依赖倒转原则和里氏代换原则,那使用对象时,就不应该知道所用原创 2020-05-18 09:30:28 · 349 阅读 · 0 评论 -
大话设计模式:第1章 简单工厂模式
第1章:简单工厂模式面向对象面向对象(object oriented)三大特性:封装、继承、多态复制 v.s. 复用,紧耦合 v.s. 松耦合尽可能避免重复代码,将业务逻辑与界面逻辑拆分简单工厂模式:工厂负责实例化对象的类from abc import ABC, abstractmethodfrom typing import Text# 计算器业务逻辑# 运算类定义为抽象类...原创 2020-04-23 18:04:54 · 237 阅读 · 0 评论 -
大话设计模式:第2章 策略模式
第2章:策略模式策略模式面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象、具有相同属性和功能的对象的抽象集合才是类。策略模式(strategy):定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。Strategy类定义所有支持的算法的公共接口ConcreteStrategy封装了具体的算法或行为,继承于S...原创 2020-04-24 09:28:54 · 143 阅读 · 0 评论 -
大话设计模式:第3章 单一职责原则
第3章:单一职责原则单一职责原则(single responsibility principle,SRP):就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。...原创 2020-04-24 09:32:51 · 208 阅读 · 0 评论 -
大话设计模式:第4章 开放-封闭原则
第4章:开放-封闭原则开放-封闭原则开放-封闭原则:软件实体(类、模块、函数等),应该可以扩展,但是不可修改。这个原则有两个特征:对于扩展是开放的(open for extension);对于更改是封闭的(closed for modification)。其目的是:在面对需求的改变时,软件设计应保持相对稳定,从而使系统可以在第一个版本以后不断推出新的版本。即面对需求,对程序的改动是通过...原创 2020-04-24 10:53:19 · 159 阅读 · 0 评论 -
大话设计模式:第5章 依赖倒转原则
第5章:依赖倒转原则依赖倒转原则面向对象关系要求强内聚、松耦合依赖倒转原则(依赖倒置原则,dependence inversion principle,DIP):高层模块不应该依赖低层模块。两个都应该依赖抽象。抽象不应该依赖细节。细节应该依赖抽像。依赖倒转原则:抽象不应该依赖细节,细节应该依赖于抽象,即,针对接口编程,不要对实现编程。不管高层模块还是低层模块,如果它们都依赖于抽...原创 2020-04-24 21:25:28 · 235 阅读 · 0 评论 -
大话设计模式:第6章 装饰模式
第6章:装饰模式装饰模式装饰模式(decorator):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。Component定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator装饰抽象类,继承了Component,从外类来扩展Component类的功能。但对...原创 2020-04-26 11:43:26 · 186 阅读 · 0 评论 -
大话设计模式:第7章 代理模式
第7章:代理模式代理模式代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。RealSubject类,定义了Proxy所代表的真实实体。Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject相同的接口,这样...原创 2020-04-26 14:52:31 · 186 阅读 · 0 评论 -
大话设计模式:第8章 工厂方法模式
第8章:工厂方法模式简单工厂 v.s. 工厂方法简单工厂模式优点:工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。局限:增加功能时,需要修改原有的工厂类,违背了开放-封装原则在简单工厂模式中,由于工厂类与分支耦合,根据依赖倒转原则,应将工厂类抽象成一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所...原创 2020-04-26 20:39:36 · 163 阅读 · 0 评论 -
大话设计模式:第9章 原型模式
第9章:原型模式原型模式原型模式(prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。Prototype类ConcretePrototype1类客户端代码这样可以直接克隆,而不用实例化ConcretePrototype1。对于.NET而言,不需要原型抽象类...原创 2020-04-27 12:29:02 · 201 阅读 · 0 评论 -
大话设计模式:第10章 模板方法模式
第10章:模板方法模式重复 = 易错 + 难改模板方法模式既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复的代码都应该要上升到父类去,而不是让每个子类都去重复。当要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,通常考虑用模板方法模式来处理。模板(template)方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到...原创 2020-04-27 19:05:52 · 200 阅读 · 0 评论 -
大话设计模式:第11章 迪米特法则
第11章:迪米特法则迪米特法则迪米特法则(law of Demeter,LoD):如果两个类不必彼此一直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第二者转发这个调用。迪米特法则又叫作最少知识原则(least knowledge principle,LKP),其首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权...原创 2020-04-27 20:11:01 · 195 阅读 · 0 评论 -
大话设计模式:第12章 外观模式
第12章:外观模式外观模式外观模式(facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高级接口,这个接口使得这一子系统更加容易使用。四个子系统的类外观类客户端代码外观模式示例任务:股票、基金买卖股票from abc import ABC, abstractmethodfrom typing import Text# 股票class ...原创 2020-04-30 01:48:20 · 181 阅读 · 0 评论 -
大话设计模式:第13章 建造者模式
第13章:建造者模式建造者模式建造者(builder)模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式又称为生成器模式。使用建造者模式时,用户只需指定需要建造的类型,而无需知道具体建造的过程和细节。Builder:为创建一个Product对象的各个部件指定的抽象接口。ConcreteBuilder:具体建造者,实现Builder接口,构造和...原创 2020-04-30 17:10:17 · 173 阅读 · 0 评论 -
大话设计模式:第14章 观察者模式
第14章:观察者模式观察者模式观察者(observer)模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自已。Subject类:主题或抽象通知者,一般用一个抽象类或者一个接口实现。它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删...原创 2020-05-04 22:08:50 · 237 阅读 · 0 评论 -
大话设计模式:第15章 抽象工厂模式
第15章:抽象工厂模式抽象工厂模式工厂方法模式(factory method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。抽象工厂模式(abstract factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。AbstractProductA和AbstractProductB是两个抽象产品,之所以为抽...原创 2020-05-06 09:23:34 · 272 阅读 · 0 评论 -
大话设计模式:第16章 状态模式
第16章:状态模式状态模式LongMethod:如果方法过长,极有可能是坏味道代码。方法过长,并且方法中有很多的if判断分支,这就意味若它的责任过大,违反单一职责原则(SRP)。面向对象设计是希望做到代码的责任分解。状态(state)模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态...原创 2020-05-06 16:51:05 · 217 阅读 · 0 评论 -
大话设计模式:第17章 适配器模式
第17章:适配器模式适配器模式适配器模式(adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。在软件开发中,系统的数据和行为都正确,但接口不符时,应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。Target:...原创 2020-05-06 19:57:34 · 210 阅读 · 0 评论 -
大话设计模式:第18章 备忘录模式
第18章:备忘录模式备忘录模式备忘录(memento)模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻其内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。...原创 2020-05-06 22:53:20 · 210 阅读 · 0 评论 -
大话设计模式:第19章 组合模式
第19章:组合模式组合模式组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式适合处理整体与部分可以被一致对待的问题。Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。Leaf在组合中表示叶节点对象...原创 2020-05-07 20:14:45 · 211 阅读 · 0 评论 -
大话设计模式:第20章 迭代器模式
第20章:迭代器模式迭代器模式迭代器模式(iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。迭代器模式适用情况:需要访问一个聚集对象,而且不管这些对象是什么都需要遍历需要对聚集有多种遍历方式迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。迭代器模式分离了集合对象的遍历行为,抽象出-个迭代器...原创 2020-05-08 10:16:54 · 207 阅读 · 0 评论 -
大话设计模式:第21章 单例模式
第21章:单例模式单例模式单例模式(Singleton):保证一个类仅有一个实例, 并提供一个访问它的全局访问点。通常可以用一个全局变量使一个对象被访问,但它不能防止实例化多个对象。一个最好的办法是让类自身负责保存它的唯一实例。这个类可以保证没有其它实例被创建,并且它可以提供一个访问该实例的方法。Singleton类,定义一个Getlnstance操作,允许客户访问它的唯一实例。GetInstance是一个静态方法,主要负责创建自己的唯一实例。客户端代码由于Singleton类封装它的原创 2020-05-12 12:02:53 · 233 阅读 · 0 评论 -
大话设计模式:第22章 桥接模式
第22章:桥接模式继承带来的麻烦对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。合成、聚合复用原则合成、聚合复用原则(composition & aggregation reuse principle,CARP),尽量使用合成、聚合,原创 2020-05-08 21:08:14 · 199 阅读 · 0 评论 -
大话设计模式:第23章 命令模式
第23章:命令模式当请求排队或记录请求日志,以及支持可撤销的操作等行为时,行为请求者与行为实现者的紧耦合并不适合。命令模式命令(command)模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。Command类,用来声明执行操作的接口。ConcreteCommand类,将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute。Invoker类,要求该命令执行这个请求。Receiver类,知道如何原创 2020-05-09 12:17:32 · 167 阅读 · 0 评论 -
大话设计模式:第24章 职责链模式
第24章:职责链模式职责链模式职责链(chain of responsibility)模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。Handler类,定义一个处理请示的接口。ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。ConcreteHandler1,当请求数在0到10之间则有权处理,否原创 2020-05-09 16:14:16 · 241 阅读 · 0 评论 -
大话设计模式:第25章 中介者模式
第25章:中介者模式中介者模式中介者(mediator)模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称调停者模式,是指中间人或者调停者的意思。将一个系统分割成许多对象通常可以增加其可复用性,但是对象间相互连接的激增又会降低其可复用性了。因为大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难。根据迪米特法则,如果两个原创 2020-05-09 18:42:14 · 171 阅读 · 0 评论 -
大话设计模式:第26章 享元模式
第26章:享元模式享元模式享元(flyweight)模式:运用共享技术有效地支持大量细粒度的对象。Flyweight类:所有具体享元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态。ConcreteFlyweight:继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间。UnsharedConcreteFlyweight是指那些不需要共享的Flyweight子类。因为Flyweight接口共享成为可能,但它并不强制共享。Flywei原创 2020-05-11 10:02:03 · 218 阅读 · 0 评论 -
大话设计模式:第27章 解释器模式
第27章:解释器模式解释器模式解释器模式(interpreter),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。AbstractExpression(抽象表达式):声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。TerminalExpression(终结符表达式):实现与文法中的终结符相关联的解释操作。实现抽象表达式中所要求的接口,主要是一个interpret()方法。文法中每一个终结符都有一个具体终结表达式与之相对应。原创 2020-05-11 15:50:15 · 168 阅读 · 0 评论 -
大话设计模式:第28章 访问者模式
第28章:访问者模式访问者模式访问者模式(visitor):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。Visitor类:为该对象结构中ConcreteElement的每一个类声明一个Visit操作。ConcreteVisitor1和ConcreteVisitor2类:具体访问者,实现每个由Visitor声明的操作。每个操作实现算法的一部分,而该算法片断乃是对应于结构中对象的类。Element类:定义一个Accept操作,它原创 2020-05-11 20:01:30 · 218 阅读 · 0 评论