设计模式
文章平均质量分 64
总结设计模式在学习过程遇到问题与理解
温逗死
一名假装努力的小学生
展开
-
看懂UML类图
统一建模语言(Unified Modeling Language,UML)是一种为系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。原创 2023-09-03 20:51:49 · 356 阅读 · 0 评论 -
【C/C++ 设计模式】设计模式总结
目标管理变化,提高复用!手段分解 VS 抽象六大原则设计模式六大原则是要比23种设计模式本身更为重要的东西。Single Responsibility Principle:单一职责原则Open Closed Principle:开闭原则Liskov Substitution Principle:里氏替换原则Law of Demeter:迪米特法则Interface Segregation Principle:接口隔离原则Dependence Inversion Principle:依原创 2021-11-27 21:37:42 · 265 阅读 · 0 评论 -
【C/C++ 设计模式】(二十三)解析器模式(Interpreter)
解析器模式动机or背景在软件构建过程中,如果其一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。模式定义给定一个语言,定义它的文法的一种表示,并定义一种解释器,这种解释器使用该表示来解析语言中句子。结构举例#include <iostream>#include <map>#include &原创 2021-11-21 15:57:13 · 173 阅读 · 0 评论 -
【C/C++ 设计模式】(二十二)访问器模式(Visitor)
访问器模式动机or背景在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个动态添加新的操作,从而避免上述问题?模式定义表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。结构举例#include <iostream>u原创 2021-11-21 14:30:04 · 490 阅读 · 0 评论 -
【C/C++ 设计模式】(二十一)命令模式(Command)
命令模式动机or背景在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合-比如需要对行为进行“记录、撤销/重(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。模式定义将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。结构举例#include <iost原创 2021-11-20 20:59:18 · 167 阅读 · 0 评论 -
【C/C++ 设计模式】(二十)职责链模式(Chain of Resposibility)
职责链动机or背景在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接收者,如果显式指定,将必不可少地带来请求发送者与接收者的紧耦合。如何使请求的发送者不需要指定具体的接收者?让请求的接收者自己在运行时决定来处理请求,从而使两者解耦。模式定义使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。结构举例#include <iostream>#include &原创 2021-11-19 18:53:46 · 584 阅读 · 0 评论 -
【C/C++ 设计模式】(十九)迭代器模式(Iterator)
迭代器动机or背景在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。模式定义提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部表示。结构举例迭代器模式最为著名的就是STL库中的六大组件之一的迭代器原创 2021-11-18 21:05:18 · 467 阅读 · 0 评论 -
【C/C++ 设计模式】(十八)组合模式(Composite)
组合模式动机or背景软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。如何将“客户代码与复杂的对象容器结构”解耦?让对象容器自己来实现自身的复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂的对象容器?模式定义将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)。结构举例#include <原创 2021-11-17 22:43:06 · 599 阅读 · 0 评论 -
【C/C++ 设计模式】(十七)备忘录模式(Memento)
备忘录模式动机or背景在软件构建过程中,某些对象的状态再转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个结点时的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。模式定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。结构举例这里举例比较简单,但现实实现比较困难复杂,要考虑很多问题,比如:保存次数,原创 2021-11-16 19:10:00 · 124 阅读 · 0 评论 -
【C/C++ 设计模式】(十六)状态模式(State)
状态模式动机or背景在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明的更改对象行为?而不会为对象操作和状态转化之间引入紧耦合?模式定义允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。结构举例我们在使用网络时,有打开、关闭、连接等状态,对于每一个操作,都存在某个状态。enum NetworkState{ Network_Ope原创 2021-11-15 19:10:23 · 1281 阅读 · 0 评论 -
【C/C++ 设计模式】(十五)中介者模式(Mediator)
中介者动机or背景在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断地变化。在这种情况下,我们可以使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。模式定义用一个中介对象来封装(封装变化)一系列地对象交互。中介者使各对象不需要显式的相互引用(编译时依赖➡运行时依赖),从而使其耦合松散(管理变化),而且可以独立地改变他们之间的交互。结构要点原创 2021-11-14 18:07:28 · 456 阅读 · 0 评论 -
【C/C++ 设计模式】(十四)适配器模式(Adapter)
适配器动机or背景在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?模式定义将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。结构类模式适配器对象模式适配器举例这里代码只是以伪代码方式呈现,给大家参考一下://目标接口(新接口)clas原创 2021-11-13 20:11:46 · 228 阅读 · 0 评论 -
【C/C++ 设计模式】(十三)代理模式(Proxy)
代理模式动机or背景在面对对象系统中,有些对象由于某些原因(比如对象的创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。模式定义为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。有四种常用的情况:远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。虚拟代理,是原创 2021-11-12 18:26:02 · 173 阅读 · 0 评论 -
【C/C++ 设计模式】(十二)外观模式(Facade)
外观模式系统间耦合的复杂度动机or背景上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦合?模式定义为子系统中的一组接口提供一个一致(稳定)的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。结构举例其实,外观模式并没有特定代码结构,更多的体现出的是一种原则和思想,即在原创 2021-11-11 20:01:57 · 632 阅读 · 0 评论 -
【C/C++ 设计模式】(十一)享元模式(Flyweight)
享元模式动机or背景在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价–主要指内存需求方面的代价。如何避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明的使用面向对象的方式来进行操作?模式定义运行共享技术有效地支持大量细粒度的对象。结构举例class Font {private: //unique object key string key; //object state //.... pub原创 2021-11-10 20:01:46 · 769 阅读 · 0 评论 -
【C/C++ 设计模式】(十)单例模式(Singleton)
单例模式动机or场景在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保他们的逻辑正确性、以及良好的效率。如何绕过常规的构建器,提供一种机制来保证一个类只能有一个实例?这应该是设计者的责任而不是使用者的责任。模式定义保证一个类仅有一个实例,并提供一个该实例的全局访问点。结构举例class Singleton{private: Singleton(); Singleton(const Singleton& other);publi原创 2021-11-09 20:41:20 · 504 阅读 · 0 评论 -
【C/C++ 设计模式】GOF-23种设计模式
GOF设计模式说到设计模式,可能让人感到困惑。这里我引用 Christopher Alexander 大师的一句话:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。在整个软件设计中,让人头大,让人感到困难的根本原因就是变化,而如何去解决各种变化带来的复杂性就是一个好的程序急需解决的。学习设计模式,目的就是能够设计出更加优美,好维护,可复用,可拓展的优秀代码。利用复用来抵御变化。COF-23 模式分类从目地上来看:原创 2021-11-07 20:33:32 · 617 阅读 · 0 评论 -
【C/C++ 设计模式】(九)构建器(Builder)
构建器(建造者模式)背景or动机在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?定义将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。结构举例主要参考《大话设计模式》和《原创 2021-11-07 20:25:06 · 431 阅读 · 0 评论 -
【C/C++ 设计模式】(八)原型模式(Prototype)
原型模式动机or背景在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求变化,这些对象经常面临着剧烈的变化,但是他们呢却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?模式定义使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。结构举例要点总结Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求原创 2021-11-06 11:38:06 · 150 阅读 · 0 评论 -
【C/C++ 设计模式】(七)抽象工厂模式(Abstract Factory)
抽象工厂动机or背景在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?模式定义提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。(与工厂方法不同之处在于“一系列”)结构举例现在我们对数据库里数据进行处理,但是我们有很多不同类型的数据库。同时处理数据库的方法比原创 2021-11-05 19:55:19 · 346 阅读 · 0 评论 -
【C/C++ 设计模式】(六)工厂方法模式(Factory Method)
工厂方法背景or动机在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?模式定义定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。结构举例现在我们程序要完成一个分割功能,而分割的对象具有多种,例如:二进制分割、文本分割、图片分割、视频分原创 2021-10-31 19:04:16 · 233 阅读 · 0 评论 -
【C/C++ 设计模式】(五)桥接模式(Bridge)
桥模式背景or动机由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?模式定义将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。结构举例说明我们需要做一个通信类,需要有业务实现以及平台功能实现。同时,这个通信类又要用在pc端以及移动端,并且在不同终端上有多种版本。使用桥模式之前:class Messager{pub原创 2021-10-30 13:18:26 · 467 阅读 · 1 评论 -
【C/C++ 设计模式】(四)装饰模式(Decorator)
装饰模式(Decorator)使用场景或动机在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能扩展变化”所导致的影响将为最低?模式定义动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继原创 2021-10-28 14:05:22 · 169 阅读 · 0 评论 -
【C/C++ 设计模式】(三)观察者模式(Observer)
观察者模式使用场景or动机在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” —— 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。模式定义定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。结构要点总结使用面向对原创 2021-10-26 20:41:00 · 313 阅读 · 0 评论 -
【C/C++ 设计模式】(二)策略模式(Strategy)
策略模式使用场景or动机在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?这就需要用到策略模式。模式定义定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。结构场景举例现有一个组织,用于各个国家之间进行交易特定货物。由于原创 2021-10-23 18:25:39 · 188 阅读 · 0 评论 -
【C/C++ 设计模式】(一)模板方法(Template Method)
COF-23 模式分类从目地上来看:创建型模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来冲击。行为型模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击。从范围来看:类模式处理类与子类的静态关系。(继承方案)对象模式处理对象间的动态关系。(组合方案)模板方法定义:定义一个操作中的算法的骨架 (稳定),而原创 2021-10-22 15:50:05 · 509 阅读 · 0 评论