设计模式
weixin_panda
这个作者很懒,什么都没留下…
展开
-
23种设计模式(C++)
文章目录一、设计模式的分类二、设计模式的六大原则1.单一职责原则2.里氏替换原则3.依赖倒转原则4.接口隔离原则5.迪米特法则6.合成复用原则三、具体设计模式1.工厂模式2.策略模式3.适配器模式4.单例模式5.原型模式、模板方法模式6.建造者模式7.外观模式、组合模式8.代理模式9.享元模式10、桥接模式11.装饰模式12.备忘录模式13.中介者模式14.职责链模式15.观察者模式16.状态模式总结和整合了网上一些设计模式资料。https://blog.csdn.net/qq_33854260/art原创 2020-12-11 18:39:37 · 1110 阅读 · 0 评论 -
常见设计模式-状态模式(C++)
状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。它有两种使用情况:(1)一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。使用场景1、一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为;2、一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常有多个操作包含这一相同的条件结构。State模式将每一原创 2020-12-11 17:49:45 · 76 阅读 · 0 评论 -
设计模式-职责链模式(C++)
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。使用场景1、有多个对象可以处理同一个请求2、在不明确指定接收者的情况下,向多个对象中的提交请求3、可动态指定一组对象处理请求考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请原创 2020-12-10 18:54:13 · 109 阅读 · 1 评论 -
设计模式-中介者模式(C++)
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了中间者的角色,协调各方利益。使用场合1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解;2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象;3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。优缺点1、减少了子类生成,Mediator将原本原创 2020-12-10 17:51:13 · 59 阅读 · 0 评论 -
设计模式-备忘录模式(C++)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态使用场景1、需要提供保存和恢复数据的相关状态场景2、提供一个可回滚rollback操作3、需要监控的副本场景。4、数据库连接的事务管理就是备忘录模式举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的形式存在。这样下次就可以继续玩,而不用从头开始。这里的进度其实就是游戏的内部状态,而这里的文件相当于是在游戏之外保存状态。这样,下次就可以从文件中读入保存的进度,从而恢复到原原创 2020-12-10 17:45:30 · 75 阅读 · 0 评论 -
设计模式-装饰模式(C++)
动态地给一个对象添加一些额外的职责。适用场景1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。2、处理那些可以取消的职责。3、不能或不好采用生成子类的方法扩充职责。就增加功能来说,装饰模式相比生成子类更为灵活。有时我们希望给某个对象而不是整个类添加一些功能。比如有一个手机,允许你为手机添加特性,比如增加挂件、屏幕贴膜等。一种灵活的设计方式是,将手机嵌入到另一对象中,由这个对象完成特性的添加,我们称这个嵌入的对象为装饰。这个装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明原创 2020-12-09 18:48:59 · 101 阅读 · 0 评论 -
设计模式-桥接模式(C++)
将抽象部份与它的实现部份分离,使它们都可以独立地变化。常用的场景1.当一个对象有多个变化因素的时候,考虑依赖于抽象的实现,而不是具体的实现。如上面例子中手机品牌有2种变化因素,一个是品牌,一个是功能。2.当多个变化因素在多个对象间共享时,考虑将这部分变化的部分抽象出来再聚合/合成进来,如上面例子中的通讯录和游戏,其实是可以共享的。3.当我们考虑一个对象的多个变化因素可以动态变化的时候,考虑使用桥接模式,如上面例子中的手机品牌是变化的,手机的功能也是变化的,所以将他们分离出来,独立的变化。优点1.原创 2020-12-09 17:40:20 · 52 阅读 · 0 评论 -
设计模式-享元模式(C++)
享元模式是为了应对大量细粒度对象重复的问题。程序中存在大量细粒度的对象,每次要使用时都必须创建一个新的对象,既影响了运行效率又增加了内存消耗。于是有了享元模式,享元模式提取出这些细粒度对象中间公共的状态(属性,我的理解),只生成一个实例对象,所有用到这些公共属性对象的地方,都指向这一个实例。常用场景1.当系统中有大量的细粒度对象实例,而且这些对象实例中有一些属性是重复的情况下,考虑使用。文本编辑器,输入法之类的常用应用。优点1.提高了系统的效率,减小了内存的消耗。2.减少了重复代码。3.减少了原创 2020-12-09 17:05:56 · 73 阅读 · 0 评论 -
设计模式-组合模式(C++)
将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性。注意两个字“树形”。这种树形结构在现实生活中随处可见,比如一个集团公司,它有一个母公司,下设很多家子公司。不管是母公司还是子公司,都有各自直属的财务部、人力资源部、销售部等。对于母公司来说,不论是子公司,还是直属的财务部、人力资源部,都是它的部门。整个公司的部门拓扑图就是一个树形结构。优点将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。使用场景原创 2020-12-09 10:54:09 · 84 阅读 · 0 评论 -
设计模式-外观模式(C++)
外观模式,很多人也把它叫做门面模式。在GOF的《设计模式:可复用面向对象软件的基础》一书中对外观模式是这样说的:将子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。细细的理解这句话;子系统中的一组接口,就好比上面举得例子中的语法分析,生成中间代码,生成汇编代码,链接成可执行程序或库;外观模式定义的一个高层接口,就好比上面说的Build按钮,通过这样的一个Build按钮,让编译器更加容易使用,对于这一点,从Linux C++/C转Windows C++/C的原创 2020-12-09 10:49:27 · 106 阅读 · 4 评论 -
常见设计模式-代理模式(C++)
定义:为其他对象提供一种代理以控制对这个对象的访问。有四种常用的情况:(1)远程代理(2)虚代理,(3)保护代理,(4)智能引用。适用场景根据目的和实现方式的不同,代理模式可分为很多种,常见的有:远程代理(Remote Proxy)为一个位于不同地址空间的对象提供一个本地代理,对代理的方法调用会导致对远程对象的方法调用。ATM 就是一个例子,ATM 可能会持有(存在于远程服务器中的)银行信息的一个代理对象。虚拟代理(Virtual Proxy)使用虚拟代理,代理可以作为一个(资源消耗较大的)对象原创 2020-12-08 18:52:05 · 94 阅读 · 0 评论 -
设计模式-建造者模式(C++)
建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(DP)。《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。应用场景1.对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。2.当一个复杂系统的子系统很多时,原创 2020-12-07 18:34:13 · 64 阅读 · 0 评论 -
设计模式-原型模式(C++)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其中有一个词很重要,那就是拷贝。可以说,拷贝是原型模式的精髓所在Prototype定义了克隆自身的Clone接口,由派生类进行实现,而实现原型模式的重点就在于这个Clone接口的实现。PrototypeA类继承自Prototype类,并实现Clone接口,实现克隆自身的操作;同时,在PrototypeA类和中需要重写默认的复制构造函数,供Clone函数调用,Clone就是通过在内部调用重写的复制构造函数实现的。在后续的编码过程中,如果某个类需原创 2020-12-07 18:32:05 · 44 阅读 · 0 评论 -
设计模式-模板模式(C++)
定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。实现方案:将算法/逻辑框架放在抽象基类中,并定义好实现接口,在子类中实现细节接口。注:策略模式,解决的是相同的问题,只是其方案是将各个接口封装为类,通过委托/组合方式解决问题使用场景多个子类有共有的方法,并且逻辑相同/逻辑相同,细节有差异对重要,复杂的算法,可以讲核心算法设计为模板方法,周边细节由子类实现重构时,经常使用的方案,将相同的代码抽象到父类,通过钩子函数约束行为。#in原创 2020-12-07 18:30:34 · 51 阅读 · 0 评论 -
常见设计模式-适配器模式(C++)
适配器模式可以将一个类的接口转换成客户端希望的另一个接口,使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作。通俗的讲就是当我们已经有了一些类,而这些类不能满足新的需求,此时就可以考虑是否能将现有的类适配成可以满足新需求的类。适配器类需要继承或依赖已有的类,实现想要的目标接口。缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直原创 2020-12-04 18:36:22 · 61 阅读 · 0 评论 -
常见设计模式-观察者模式(C++)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化,关注它的对象就会得到通知;这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者。在以下任一情况下都可以使用观察者模式:1、当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用;2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变原创 2020-12-04 15:01:53 · 78 阅读 · 0 评论 -
常见设计模式-策略模式(C++)
在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。策略模式为了适应不同的需求,只把变化点封装了,这个变化点就是实现不同需求的算法,但是,用户需要知道各种算法的具体情况。就像上面的加班工资,不同的加班情况,有不同的算法。我们不能在程序中将计算工资的算法进行硬编码,而是能自由的变化的。这就是策略模式。方式一:直接通过参数指定,传入一个特定算法的指针。class Strateg原创 2020-12-03 18:51:05 · 121 阅读 · 0 评论 -
常见设计模式-工厂模式(C++)
1、简单工厂模式简单工厂模式是属于创建型模式,又叫做静态工厂方法(static Factory Method)模式,简单工厂模式是由一个工厂对象决定创建出来哪一种产品类的实例.简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一类产品类(这些产品类继承自一个父类或接口)的实例。打个比方假设有一个工厂,他能生产出A、B两种产品。当客户需要产品的时候一定要告诉共产是哪种产品,是A还是B。当新增加一种新产品的时候,那么就要去修改工厂的类。class Product{public:原创 2020-12-03 16:53:09 · 81 阅读 · 0 评论 -
常见设计模式_单例模式(C++)
单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。应用场景单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统原创 2020-12-02 17:47:19 · 73 阅读 · 0 评论