![](https://img-blog.csdnimg.cn/20201005171507213.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
设计模式
设计模式
小小何先生
总是感觉自己是个英雄,还很帅!
展开
-
23种设计模式(二十四)领域规则之解析器
在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。动机 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。 在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。模式定义 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子。翻译 2020-10-05 16:48:08 · 240 阅读 · 0 评论 -
23种设计模式(二十三)行为变化之访问器
文章目录动机设计方法一设计方法二模式定义要点总结动机 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。 如何在不更改类层次结构的前提下,在运行时根据需要透明地位类层次结构上的各个类动态添加新的操作,从而避免上述问题?设计方法一#include <iostream>using namespace std;class Visitor;class Element{翻译 2020-10-05 16:24:19 · 252 阅读 · 0 评论 -
23种设计模式(二十二)行为变化之命令模式
文章目录动机模式定义要点总结 在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。”行为变化“模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。动机 在软件构建过程中”行为请求者“与”行为实现责“通常呈现一种”紧耦合“。但在某些场合–比如需要对行为进行”记录“、撤销/重(undo/redo)、事务等处理,这种无法抵御变化的紧耦合是不合适的。 在这种情况下,如何将”行为请求者“与”行为实现者“解耦?将一组行为抽象为对对象,可以实现二者之间的松耦合。模式翻译 2020-10-05 16:11:42 · 302 阅读 · 0 评论 -
23种设计模式(二十一)数据结构之职责链
动机 在软件构建过程中, 一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。模式定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。代码#include <iostream>#include <stri翻译 2020-10-05 15:51:48 · 216 阅读 · 0 评论 -
23种设计模式(二十)数据结构之迭代器
动机 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种”透明遍历“也为”同一种算法在多种集合对象上进行操作“提供了可能。模式定义 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露(稳定)该对象的内部表示。代码template<typename T>class Iterator{public: virtual void first() = 0; vi翻译 2020-10-05 15:18:37 · 166 阅读 · 0 评论 -
23种设计模式(十九)数据结构之组合模式
文章目录数据结构模式动机模式定义代码要点总结数据结构模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。动机 软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁变化,带来了代码的维护性、扩展性等弊端。模式定义 将对象组合成树形结构以表示”部分翻译 2020-10-05 15:07:15 · 253 阅读 · 0 评论 -
23种设计模式(十八)状态变化之备忘录
文章目录动机模式定义要点总结动机 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。模式定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。class Memento{ string state; //..public: Memento(const string翻译 2020-10-05 14:38:40 · 238 阅读 · 0 评论 -
23种设计模式(十七)状态变化之状态模式
文章目录动机设计方法一设计方法二模式定义要点总结 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?”状态变化“模式为这一问题提供了一种解决方案。动机 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。设计方法一 假设有一个网络操作的功能,有三种状态:打开、关闭、连接。每种状态下的功能不一样。state1.cppenum NetworkState翻译 2020-10-05 11:06:03 · 493 阅读 · 0 评论 -
23种设计模式(十六)接口隔离之中介者
动机 在软件构建过程中,经常会出现多个对象互相关联互交的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断地变化。模式定义 用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖-> 运行时依赖),从而使其耦合松散(管理变化),而且可以独立地改变他们之间的交互。要点总结 将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变”多个对象互相关联“为”多个对象和一个中翻译 2020-10-05 10:30:09 · 240 阅读 · 0 评论 -
23种设计模式(十五)接口隔离之适配器
动机 在软件系统中,由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。 如何应对这种”迁移的变化“?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?Adapter.cpp//目标接口(新接口)class ITarget{public: virtual void process()=0;};//遗留接口(老接口)class IAdaptee{public: virtual voi翻译 2020-10-04 22:55:05 · 164 阅读 · 0 评论 -
23种设计模式(十四)接口隔离之代理模式
代理模式同样也是属于增加一层间接层的这样一种模式。动机 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。 比如一个分布式的系统,想要去访问另一台机器中的进程。 如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。模式定义 为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。client.cppcla翻译 2020-10-04 22:35:50 · 279 阅读 · 0 评论 -
23种设计模式(十三)接口隔离之门面模式
接口隔离模式:在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。...翻译 2020-10-04 21:55:50 · 350 阅读 · 0 评论 -
23种设计模式(十二)对象性能之享元模式
享元模式与与单价模式都属于性能模式。都是用来解决对象带来的性能成本的问题。动机 在软件系统中如果采用纯粹的对象方案,会存在大量细粒度的对象充斥在系统中,从而带来很高的运行时代价–主要指内存需求方面的代价。设计方法一flyweight.cppclass Font {private: //unique object key string key; //object state //.... public: Font(const翻译 2020-10-04 21:16:07 · 225 阅读 · 0 评论 -
23种设计模式(十一)对象性能之单件模式
文章目录动机模式定义要点总结 之前所述的方法都是在通过抽象的设计来实现松耦合的设计。面向对象很好地解决了“抽象”的问题,但是不可避免地要付出一定的代价。比如抽象里面有虚函数和继承,虚函数带来的内存的消耗还是比较多的。 对于通常情况来讲,这些消耗都可以忽略不计,但是在某些情况下,面向对象所带来的成本必须谨慎处理。动机 在软件系统中,经常有这样一些特殊类,必须保证它们在系统中只存在一个实例,才能确保他们的逻辑正确性,以及良好的效率。 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?翻译 2020-10-04 20:47:17 · 161 阅读 · 0 评论 -
23种设计模式(十)对象创建之构建器
文章目录模式定义要点总结 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。class House{ //....};class HouseBuilder {public: House* GetResult(){ return pHouse; } virtual ~HouseBuilder(){}pr翻译 2020-10-04 10:53:25 · 288 阅读 · 0 评论 -
23种设计模式(九)对象创建之原型模式
文章目录动机模式定义要点总结动机 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 之前的工厂方法和抽象工厂将抽象基类和具体的实现分开。原型模式也差不多,但是原型模式将抽象基类合并。Prototype.cpp//抽象类class ISplitter{public: virtual void split()=0; virtual ISplitter* clone()=0; //通过克翻译 2020-10-04 10:34:32 · 334 阅读 · 0 评论 -
23种设计模式(八)对象创建之抽象工厂
文章目录动机设计方法一设计方法二设计方法三模式定义要点总结 抽象工厂与工厂方法极其类似,都是绕开new的,但是有些许不同。动机 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。 假设现在有这样一个需求,我们需要做一个数据访问层。设计方法一 在数据访问层需要创建一系列的对象,比如建立链接,创建数据库的命令对象,创建数据库的DataReader对象。但是数据库可能不只有Sql的,可能还有别的类型的。EmployeeDAO1翻译 2020-10-04 09:50:12 · 260 阅读 · 0 评论 -
23种设计模式(七)对象创建之工厂方法
文章目录动机设计方法一设计方法二模式定义要点总结 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。动机 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。设计方法一FileSplitter1.cppclass ISplitter{public: virtual void split()=0; virtual ~ISplitter翻译 2020-10-03 20:27:10 · 169 阅读 · 0 评论 -
23种设计模式(六)单一职责之桥模式
文章目录动机设计方法一设计方法二模式定义要点总结动机 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。设计方法一class Messager{public: virtual void Login(string username, string password)=0; virtual void SendMessage(string message)=0; virtual void SendPicture(Image image)=0;翻译 2020-10-03 19:21:15 · 850 阅读 · 0 评论 -
23种设计模式(五)单一职责之装饰模式
文章目录动机设计方法一模式定义要点总结 装饰模式属于一个新的类别,单一职责模式。同样属于单一职责模式的还有桥模式。 所谓的单一职责模式说的是:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。 并不是说别的模式没有职责模式问题,而是装饰模式和桥模式在单一职责模式问题上表现得比较特殊。动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性翻译 2020-10-03 19:20:58 · 225 阅读 · 0 评论 -
23种设计模式(四)组件协作之观察者模式
现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。 典型模式可以分为:Template Method,Strategy和Observer / Event。 观察者模式:在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ---- 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。假设我们做一个文件分割翻译 2020-10-03 19:20:21 · 257 阅读 · 0 评论 -
23种设计模式(三)组件协作之策略模式
策略模式仍然是一个组件写作类的模式。策略模式所解决的问题是: 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。 假设一个计算税的计算公式:设计方法一strategy1.cppenum TaxBase { CN_Tax, US_Tax, DE_Tax, FR_Tax //更改};class SalesOrder{ TaxBase tax;pub翻译 2020-10-03 19:20:09 · 322 阅读 · 0 评论 -
23种设计模式(二)组件协作之模板方法
文章目录Template Method 模式设计方法一设计方法二两种方法对比模式定义 23种设计模式主要可以分为以下几类:从目的来看:创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。行为型(Behavioral)模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象翻译 2020-10-03 19:19:47 · 266 阅读 · 0 评论 -
设计模式(一)面向对象设计原则
了解面向对象继承机制(封装、继承、多态)并不代表把握面向对象机制所带来的抽象意义。class Point {public: int x; int y;};class Line {public: Point start; Point end; Line(const Point& start, const Point& end) { this->start = start; this->end = end; };};...翻译 2020-10-03 19:19:33 · 431 阅读 · 1 评论