设计模式
justkong
专注于网络通信,音视频处理
展开
-
设计模式--观察者模式Observer(对象行为型)
一、观察者模式观察者模式是在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多。二、UML类图三、示例//观察者class Observer {public: Observer() {} virtual ~Observer() {} ...原创 2017-01-20 09:33:00 · 207 阅读 · 0 评论 -
设计模式中类之间的关系
面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。他们的耦合度依次增强。1.依赖(Dependence)描述:可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。表现在代码层面,类A当中使用了类B,其中类B是作为类A的方法参数、方法中的局部变量、或者静态方法调用。注意,要...原创 2014-10-07 16:26:00 · 189 阅读 · 0 评论 -
装饰模式和代理模式对比
一、装饰模式用户使用代码://基类class Subject{public: virtual void operation();};//具体类class ConcreteSubject : public Subject{public: virtual void operation();};//装饰类class Decorate : publi...原创 2019-08-14 19:26:50 · 368 阅读 · 0 评论 -
设计模式-策略模式Strategy(对象行为型)
一、概述策略模式就是定义一组算法,将每个算法封装起来,并且使它们之间可以互换。(1)Strategy抽象策略角色每个策略或者算法必须具有的方法和属性(2)ConcreteStrategy具体策略角色实现策略中的操作,该类含有具体的算法(3)Context封装角色,上下文角色启封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化class Strat...原创 2019-08-24 09:25:15 · 221 阅读 · 0 评论 -
设计模式--享元模式Flyweight(对象结构型)
一、概述享元模式(Flyweight),就是利用共享技术有效地支持大量细粒度的对象。当程序创建大量的对象时有损程序的性能,同时还容易造成内存溢出。我们将对象内部的信息进行细粒度地划分,将一部分信息提取出来进行共享,可以节省内存空间,提高程序性能。对象细粒度化后的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic)。内部状态是对象可以共享出来的信息,存储在享元对象...原创 2019-08-22 14:56:38 · 243 阅读 · 0 评论 -
设计模式-职责链模式Chain Of Responsibility(对象行为型)
一、概述职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。二、类图Handler一方面需要定义处理请求的方法,另一方面需要定义责任链的下一个继任者(successor)。ConcreteHandler类是具体处理者类,处理它所负责的请求,可访问它的后继者,如果可以处理该请求,...原创 2019-08-22 18:19:52 · 198 阅读 · 0 评论 -
设计模式-解释器模式Interpreter(对象行为型)
一、概述解释器模式是一种按照规定语法进行解析的方案。给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。二、类图AbstractExpression为抽象解释器TerminalExpression为终结符表达式。实现与文法中的元素相关联的操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。Nontermi...原创 2019-08-22 19:54:37 · 217 阅读 · 0 评论 -
设计模式-迭代器模式Interator(对象行为型)
一、概述迭代器模式提供一种方法顺序访问一个集合Aggregate(容器)对象中的各个元素,而又不暴露该对象的内部表示(细节)。迭代器是为容器服务的,而能容纳对象的所有类型都可以称之为容器。二、类图1、Iterator抽象迭代器,定义访问和遍历元素的接口,而且基本上有固定的几个方法:(1)first获取第一个元素(2)next访问下一个元素(3)isDone是否已经访问到...原创 2019-08-22 20:11:05 · 176 阅读 · 0 评论 -
设计模式-备忘录模式Memento(对象行为型)
一、概述在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。二、类图Originator:发起人,负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。Memento:备忘录,负责存储Or...原创 2019-08-23 15:11:09 · 172 阅读 · 0 评论 -
设计模式-中介者模式Mediator(对象行为型)
一、概述中介者模式用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其松耦合,而且可以独立地改变它们之间的交互。二、类图Colleague是抽象同事类。而ConcreteColleague是具体同事类,每个具体同事类只知道自己的行为,而不了解其他同事的情况,但它们却都认识中介者对象,通过中介者角色来和其他同事角色进行通信协作。Mediator是抽...原创 2019-08-23 14:19:45 · 266 阅读 · 0 评论 -
设计模式-状态模式State(对象行为型)
一、概述当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。State为抽象状态角色,负责对象状态定义,并且封装环境角色以实现状态切换ConcreteState为具体状态角色,负责本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。Context为环境角色,定义客户端需要的接口,并且负责具体状态的切换。//te...原创 2019-08-30 14:32:37 · 370 阅读 · 0 评论 -
设计模式-模板方法模式Template Method(对象行为型)
一、概述定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。AbstractClass叫做抽象模板,它的方法分为两类:(1)原始方法,是由子类实现的方法,并且在模板方法被调用(2)模板方法,可以有一个或几个,实现对原始方法的调度,完成固定的逻辑class AbstractClass{public: ...原创 2019-08-30 15:02:13 · 289 阅读 · 0 评论 -
设计模式的几大原则
1.单一职责原则类的职责要单一,不能将太多的职能放在一个类中。2.开闭原则软件实体对扩展是开放的,但对修改是关闭的,即在不修改一个软件的基础上去扩展其功能。实现开闭原则的关键是抽象化,找到系统的可变因素,将它封装起来。3.里氏替换原则一个可以接受基类对象的地方必然可以接受一个子类对象。在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,使用子类来替换父类对象。...原创 2016-12-28 08:43:00 · 118 阅读 · 0 评论 -
设计模式--工厂模式Factory(创建型)
工厂模式属于创建型模式,分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。一、简单工厂模式在工厂中做判断,根据产品类型从而创造相应的产品,当增加新产品时需要修改工厂类。例如:enum CTYPE {COREA, COREB}; class SingleCore { public: virtual void Show() = 0;}; //单核A ...原创 2016-12-28 09:11:00 · 256 阅读 · 0 评论 -
设计模式--命令模式Command(对象行为型)
一、概述将一个请求封装为一个对象,从而让你可用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。二、类图(1)Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。(2)ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现,可以根据不同的命令定义不同...原创 2016-12-30 14:13:00 · 187 阅读 · 0 评论 -
设计模式--代理模式Proxy(结构型)
一、代理模式为其他对象提供一种代理以控制对这个对象的访问。二、UML图三、例子(1)虚代理考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理以替代真实的图形。待到真正需要打开图形时,仍由代理负责...原创 2016-12-30 11:15:00 · 137 阅读 · 0 评论 -
设计模式--外观模式Facade(结构型)
一、外观模式外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更容易被使用。二、UML图三、例子举个编译器的例子,假设编译一个程序需要经过四个步骤:词法分析、语法分析、中间代码生成、机器码生成。学过编译都知道,每一步都很复杂。对于编译器这个系统,就可以使用外观模式。可以定义一个高层接口,比如名为Compiler的类,里面有一个名为Ru...原创 2016-12-30 09:50:00 · 115 阅读 · 0 评论 -
设计模式--装饰模式Decorate(结构型)
一、装饰模式动态地给一个对象添加额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。二、UML图1.Component(概念中提到的对象接口),也就是“被装饰者”。2.ConcreateComponent(未添加任何职责的,对象接口的子类)。3.Decorator(装饰者抽象类),扩张了对象接口的功能。4.Concrete...原创 2016-12-30 09:41:00 · 199 阅读 · 0 评论 -
设计模式--组合模式Composite(结构型)
一、概念组合模式的关键是定义一个抽象类,它既可以实例化为叶子,也可以实例化为容器。用户针对该抽象类进行编程,无须知道它到底是叶子还是容器,可以对其进行统一处理。同时容器子类和抽象类之间还建立一个聚合关联关系,在容器类中既可以包含叶子也可以包含容器,以此实现递归,形成一个树形结构。二、UML图三、例子一个文件系统,系统中可以有文件和文件夹两种形式。文件或者文件夹只能由上一层的父节点...原创 2016-12-28 15:32:00 · 168 阅读 · 0 评论 -
设计模式--桥接模式Bridge(结构型)
一、概述桥接模式就是将抽象和实现解耦,使得两者可以独立地变化。通俗地说,如果类存在两个或者多个维度的继承关系时,可以考虑用聚合代替继承,聚合关系就是“桥梁”,所以称这种模式为桥接模式。二、UML图抽象类(Abstraction):定义抽象类的接口,维护一个指向Implementor类型对象的指针扩充抽象类(RefinedAbstraction):扩充由Abstraction定义...原创 2016-12-28 15:00:00 · 86 阅读 · 0 评论 -
设计模式--适配器模式Adapter(结构型)
一、适配器模式适配器模式的主要作用是在新接口和老接口之间进行适配。将一个类的接口转换成客户端期望的另外一个接口。其实适配器模式有点无赖之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该通过重构统一接口。二、适配器模式分为类适配器模式和对象适配器模式类适配器模式:适配器使用多重继承对一个接口与另外一个接口进行匹配。对象适配器模式:适配器在新接口中利用已有类的实例来实现接口的匹...原创 2016-12-28 13:48:00 · 137 阅读 · 0 评论 -
设计模式--原型模式Prototype(创建型)
一、原型模式用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。原型模式实现的关键就是实现Clone函数,还需要实现深拷贝。二、UML类图三、例子//父类class Resume{protected: char *name;public: Resume() {} virtual ~Resume() {} virtual Res...原创 2016-12-28 11:01:00 · 109 阅读 · 0 评论 -
设计模式--建造者模式Builder(创建型)
一、首先看建造者模式的UML图:二、再来看一个建造者模式的例子class Builder {public: virtual void BuildHead() {} virtual void BuildBody() {} virtual void BuildLeftArm(){} virtual void BuildRightArm() {} ...原创 2016-12-28 10:40:00 · 198 阅读 · 0 评论 -
设计模式--单例模式Singleton(创建型)
单例模式很显然是定义一个类,这个类在程序中只有唯一的实例对象。一般单例类的构造函数是私有的,只能通过调用静态函数GetInstance来获取实例。一、单例模式有三种:懒汉式单例、饿汉式单例、登记式单例(利用java内部类的概念)。1.懒汉式单例public class Singleton { private static Singleton singleton; pr...原创 2016-12-28 10:10:00 · 129 阅读 · 0 评论