![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
GOF的《设计模式》学习整理的读书笔记
听峰问雨
这个作者很懒,什么都没留下…
展开
-
【设计模式】行为型模式-Interpreter模式
功能给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子解决主要解决:对于一些固定文法构建一个解释句子的解释器何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。如何解决:构建语法树,定义终结符与非终结符关键代码:构建环境类,包...原创 2020-02-18 21:34:36 · 115 阅读 · 0 评论 -
【设计模式】行为型模式-Iterator模式
功能提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示解决主要解决:不同的方式来遍历整个整合对象何时使用:遍历一个聚合对象如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象关键代码:定义接口:hasNext, next优缺点优点:它支持以不同的方式遍历一个聚合对象迭代器简化了聚合类在同一个聚合上可以有多个遍历在迭代器模式中,增加新的聚...原创 2020-02-17 21:50:56 · 113 阅读 · 0 评论 -
【设计模式】行为型模式-Chain of Responsibility模式
功能避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止解决主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。何时使用:在处理消息的时候以过滤很多道如何解决:拦截的类都实现统一接口关键代码:Handl...原创 2020-02-16 20:47:58 · 115 阅读 · 0 评论 -
【设计模式】行为型模式-Visitor模式
功能主要将数据结构与数据操作分离解决主要解决:稳定的数据结构和易变的操作耦合问题何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中如何解决:在被访问的类里面加一个对外提供接待访问者的接口关键代码:在数据基础类里面有一个方法接受访问者,将自身引用传入访问者优缺点优点:符合单一职责原则...原创 2020-02-15 16:29:42 · 121 阅读 · 0 评论 -
【设计模式】行为型模式-Command模式
功能将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。解决主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"...原创 2020-02-15 15:51:18 · 75 阅读 · 0 评论 -
【设计模式】行为型模式-Mediator模式
功能用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互解决主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理何时使用:多个类相互耦合,形成了网状结构如何解决:将上述网状结构分离为星型结构关键代码:对象 Col...原创 2020-02-14 17:14:45 · 72 阅读 · 0 评论 -
【设计模式】行为型模式-Memento模式
功能在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态解决主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。如何解决...原创 2020-02-14 11:46:32 · 89 阅读 · 0 评论 -
【设计模式】行为型模式-Observer模式
功能定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新解决主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。如何解决:使用面向对象技术,可以将这种依赖关系弱化关键代码:在抽象类里有一个 Arra...原创 2020-02-13 16:40:30 · 112 阅读 · 0 评论 -
【设计模式】行为型模式-State模式
功能允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类解决主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为何时使用:代码中包含大量与对象状态有关的条件语句如何解决:将各种具体的状态类抽象出来关键代码:状态模式的接口中有一个或者多个方法优缺点优点:封装了转换规则枚举可能的状态,在枚举状态之前需要确定状态种类将所有与...原创 2020-02-13 15:03:21 · 75 阅读 · 0 评论 -
【设计模式】行为型模式-Strategy模式
功能定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换解决主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为如何解决:将这些算法封装成一个一个的类,任意地替换关键代码:实现同一个接口优缺点优点:算法可以自由切换避免使用多重条件判断扩展性良好缺点:策略类会增...原创 2020-02-12 21:11:05 · 84 阅读 · 0 评论 -
【设计模式】行为型模式-Template模式
功能定义一个操作中的算法的骨架,而将一些步骤延迟到子类中解决主要解决:一些方法通用,却在每一个子类都重新写了这一方法何时使用:有一些通用的方法如何解决:将这些通用算法抽象出来关键代码:在抽象类实现,其他步骤在子类实现优缺点优点:封装不变部分,扩展可变部分提取公共代码,便于维护行为由父类控制,子类实现缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使...原创 2020-02-11 22:09:00 · 61 阅读 · 0 评论 -
【设计模式】结构型模式-Proxy模式
功能为其他对象提供一种代理以控制对这个对象的访问解决主要解决:在直接访问对象时带来的问题何时使用:想在访问一个类时做一些控制如何解决:增加中间层关键代码:实现与被代理类组合优缺点优点:职责清晰高扩展性智能化缺点:请求的处理速度变慢需要额外的工作量应用场景应用实例:Windows 里面的快捷方式。猪八戒去找高翠兰结果是孙悟空变的,可以这样理...原创 2020-02-11 21:06:47 · 80 阅读 · 0 评论 -
【设计模式】结构型模式-Facade模式
功能为子系统中的一组接口提供一个一致的界面解决主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。何时使用:客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。定义系统的入口。如何解决:客户端不与系统耦合,外观类与系统耦合关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。优缺点优点:减少系统相互...原创 2020-02-10 22:34:50 · 97 阅读 · 0 评论 -
【设计模式】结构型模式-Flyweight模式
功能运用共享技术有效地支持大量细粒度的对象。解决主要解决:有大量对象,可能造成内存溢出何时使用:系统中有大量对象对象消耗大量内存对象的状态大部分可以外部化对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替系统不依赖于这些对象身份,这些对象是不可分辨的如何解决:用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象...原创 2020-02-10 20:53:34 · 255 阅读 · 0 评论 -
【设计模式】结构型模式-Composite模式
功能将对象组合成树形结构以表示"部分-整体"的层次结构。解决主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。何时使用:您想表示对象的部分-整体层次结构(树形结构)。您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。如何解决:树枝和叶子实现统一...原创 2020-02-09 21:29:27 · 100 阅读 · 0 评论 -
【设计模式】结构型模式-Decorator模式
功能允许向一个现有的对象添加新的功能,同时又不改变其结构。解决主要解决:为扩展一个类经常使用继承方法实现何时使用:在不想增加很多子类的情况下扩展类如何解决:将具体功能职责划分,同时继承装饰者模式关键代码:Component 类充当抽象角色,不应该具体实现。修饰类引用和继承 Component 类,具体扩展类重写父类方法。优缺点优点:装饰类和被装饰类可以独立发展,不会...原创 2020-02-08 21:01:36 · 87 阅读 · 0 评论 -
【设计模式】结构型模式-Adapter模式
功能负责加入独立的或者不兼容的接口功能解决主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。何时使用:系统需要使用现有的类,而此类的接口不符合系统的需要。想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。通过接口转换,将一个类插入另一个...原创 2020-02-07 20:44:13 · 117 阅读 · 0 评论 -
【设计模式】结构型模式-Bridge模式
功能将抽象部分与实现部分分离,使它们都可以独立的变化解决主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活何时使用:实现系统可能有多个角度分类,每一种角度都可能变化如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合关键代码:抽象类依赖实现类优缺点优点:抽象和实现的分离优秀的扩展能力实现细节对客户透明缺点:增加系统的理解...原创 2019-12-30 18:15:01 · 73 阅读 · 0 评论 -
【设计模式】创建型模式-Prototype模式
原型模式是用于创建重复的对象,同时又能保证性能功能用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。解决主要解决:在运行期建立和删除原型。何时使用:当一个系统应该独立于它的产品创建,构成和表示时当要实例化的类是在运行时刻指定时,例如,通过动态装载为了避免创建一个与产品类层次平行的工厂类层次时当一个类的实例只能有几个不同状态组合中的一种时如何解决:利用已有的...原创 2019-12-25 16:50:58 · 80 阅读 · 0 评论 -
【设计模式】创建型模式-Sington模式
这个模式设计到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:单例类只能有一个实例单例类必须自己创建自己的唯一实例单例类必须给所有其他对象提供这一实例功能保证一个类仅有一个实例,并提供一个它的全局访问点解决主要解决:一个全局使用的类频繁地创建与销毁何时使用:当你想要控制实例数目,...原创 2019-12-20 17:10:05 · 292 阅读 · 0 评论 -
【设计模式】创建型模式-Builder模式
建造者模式使用多个简单的对象一步一步构建成复杂的对象功能将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示解决主要解决:在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。何时使用:一些基本部件不会变,而其组合经常变化的时候。...原创 2019-12-19 15:56:04 · 84 阅读 · 0 评论 -
【设计模式】创建型模式-Abstract Factory模式
功能提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类解决主要解决:主要解决接口选择的问题何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品如何解决:在一个产品族里面,定义多个产品关键代码:在一个工厂里聚合多个同类产品与工厂方法的区别工厂方法是在解决一个产品多个层级方面的事情抽象工厂致力于解决多个产品多个层级方面的是事情优缺点优点:保证...原创 2019-12-18 14:36:37 · 77 阅读 · 0 评论 -
【设计模式】创建型模式-Factory模式
功能定义创建对象的接口,封装了对象的创建使得具体化类的工作延迟到了子类中解决主要解决:解决接口选择问题何时使用:明确地计划不同条件下创建不同实例时关键代码:创建过程在其子类执行优缺点优点:创建对象时只需知道创建名称即可扩展性高封装性好缺点:增加复杂度增加了系统具体类的依赖应用场景应用实例:你要做一个披萨,我只需要知道披萨的名字,具体怎么...原创 2019-12-17 18:18:11 · 89 阅读 · 0 评论 -
【设计模式】1 引言
什么是设计模式Christopher Alexander说过:“每一个模式描述描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。”碰到模式,我们通常会问模式的名称?它是干嘛用的?能解决什么问题?它的优势在哪里?于是乎也就有了一个模式的四个基本要素:模式名称(pattern name):一个助记名,方便人们能够统一的称...原创 2019-12-16 18:18:33 · 146 阅读 · 0 评论