C++设计模式
文章平均质量分 57
常用的设计模式学习记录
看那年十七
兴趣 + 努力 = 快乐学习
展开
-
C++设计模式之迭代器模式(数据结构)(Iterator )
C++设计模式之迭代器模式(数据结构)(Iterator )1、序论 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一-的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操原创 2022-01-17 18:45:14 · 175 阅读 · 0 评论 -
C++设计模式之访问器模式(行为变化)(Visitor )
C++设计模式之访问器模式(行为变化)(Visitor )1、序论 在组件的构建模式中,组件的行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。 在软件构建过程中,由于需求的改变某些类层次结构中常常需 要增加新的行为(方法), 如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。 如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避原创 2022-01-15 22:29:24 · 227 阅读 · 0 评论 -
C++设计模式之命令模式(行为变化)(Command)
C++设计模式之命令模式(行为变化)(Command)1、序论 在组件的构建模式中,组件的行为的变化经常导致组件本身剧烈的变化。“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。 在软件构建过程中,行为请求者与行为实现者同长呈现一种紧耦合。但在某些场合----比如需要对行为进行“记录、撤销、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者” 与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。原创 2022-01-14 23:06:59 · 191 阅读 · 0 评论 -
C++设计模式之解析器模式(领域规则)(Interpreter)
C++设计模式之解析器模式(领域规则)(Interpreter)1、序论 在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。 在这种情况下,将特定领域的问题表达为某种语法规则下的句子, 然后构建一个解释器来解释这样的句子 ,从而达到解决问题的目的。模式的定义: 给定一个语言原创 2022-01-13 19:29:39 · 135 阅读 · 0 评论 -
C++设计模式之组合模式(数据结构)(Composite)
C++设计模式之组合模式(数据结构)(Composite)1、序论 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大的破坏组件的复用。这时候,将这些特定的数据结构封装在内部,在外部提供统一接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。 软件在某种情况下,客户代码过多的依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起客户代码的频繁改变。带来了带啊吗的维护性、扩展性等弊端。 如何将客户代码与复杂的对象容器结原创 2022-01-12 20:11:30 · 106 阅读 · 0 评论 -
C++设计模式之状态模式(状态变化)(State)
C++设计模式之状态模式(状态变化)(State)1、序论 在组件构建的过程中,某些对象的状态经常会面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。 在软件系统构建的过程中,某些对象的状态如果有变化,其行为也会随之而发生变化,比如说文档处于只读的状态,其支持的行为和读写状态的支持的行为就可能完全的不同。 如何在运行时根据对象的状态来透明的更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?模式的定义: 允许一个原创 2022-01-12 20:10:19 · 236 阅读 · 0 评论 -
C++设计模式之适配器模式(接口隔离)(Adapter)
C++设计模式之适配器模式(接口隔离)(Adapter)1、序论 在组件构建的过程中,某些接口之间的依赖常常会带来很多的问题、甚至根本无法去实现。采用添加一层间接的稳定接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放进新的环境中去应用,但是新环境要求的接口是这些现存对象所不满足的。 如何去应对这种“迁移的变化”?如何既能利用现有对象的良好的实现,同时又能够满足新的应用环境所要求的接口?模式的定义: 将一个类原创 2022-01-12 20:09:30 · 162 阅读 · 0 评论 -
C++设计模式之代理模式(接口隔离)(Proxy)
C++设计模式之代理模式.(接口隔离)(Proxy)1、序论 在组件构建的过程中,某些接口之间的依赖常常会带来很多的问题、甚至根本无法去实现。采用添加一层间接的稳定接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。 如何简化外部客户程序和系统之间的交互接口?如何将外部客户程序的演化和内部的子系统的变化之间的依赖相互解耦?模式的定义: 为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。2、代理模式的结构类图3、代码实现(伪代码)class ISubject{原创 2022-01-12 10:24:06 · 507 阅读 · 0 评论 -
C++设计模式之门面模式(接口隔离)(Facade)
C++设计模式之门面模式.(接口隔离)(Facade)1、序论 在组件构建的过程中,某些接口之间的依赖常常会带来很多的问题、甚至根本无法去实现。采用添加一层间接的稳定接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。 如何简化外部客户程序和系统之间的交互接口?如何将外部客户程序的演化和内部的子系统的变化之间的依赖相互解耦?模式的定义: 为子系统中一组接口提供一个一致稳定的界面Dacede模式定义了一个高层的接口,这个接口使得这一子系统更加的容易使用(复用).2、门面模式的结构类原创 2022-01-12 10:23:12 · 117 阅读 · 0 评论 -
C++设计模式之享元模式(对象性能)(FlyWeight)
C++设计模式之享元模式.(对象性能)(FlyWeight)1、序论 面向对象很好的解决了抽象的问题,但是必不可免地要付出一定的代价。对于通常的情况而言,面向对象的成本大都可以忽略不记。但是某些情况下,面向对象所带来的成本必须谨慎的处理。 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价—》主要是内存需求的方面。 如何在避免大量细粒度对象问题的同时,让外部客户程序依然能够透明的使用面向对象的方式来进行操作?模式的定义: 运用共享技术原创 2022-01-12 10:22:17 · 121 阅读 · 0 评论 -
C++设计模式之原型模式(对象创建)(Prototype)
C++设计模式之原型模式(对象创建)(Prototype)1、序论 通过“对象创建” 模式绕开new,来避免对象创建(new)过程 中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它 是接口抽象之后的第一步工作。 在软件相同中,经常面临着“某些结构复杂的对象的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有一些比较问稳定一致的接口。 如何应对这些变化?如何向”客户程序(使用这些对象的程序)”隔离出这些易变的对象。从而达到易变的对象不随需求的变化而变化?原创 2022-01-11 10:50:28 · 322 阅读 · 0 评论 -
C++设计模式之抽象工厂模式(对象创建)(Abstract Factory )
C++设计模式之抽象工厂模式(对象创建)(Abstract Factory )1、序论 通过“对象创建” 模式绕开new,来避免对象创建(new)过程 中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它 是接口抽象之后的第一步工作。 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工 作;同时,由于需求的变化,往往存在更多系列对象的创建工作。 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一 种“封装机制”来避免客户程序和这种“多系列具体对象创建工作” 的紧耦原创 2022-01-11 10:49:35 · 78 阅读 · 0 评论 -
C++设计模式之工厂模式(对象创建)(Factory Method)
C++设计模式之工厂模式(对象创建)(Factory Method)1、序论 通过“对象创建” 模式绕开new,来避免对象创建(new)过程 中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它 是接口抽象之后的第一步工作。 在软件系统中,经常面临着创建对象的工作;由于需求的变化, 需要创建的对象的具体类型经常变化。 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一 种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧 耦合模式的定义: 定义一个用于创建原创 2022-01-11 10:48:49 · 178 阅读 · 0 评论 -
C++设计模式之桥模式(单一职责)(Bridge)
C++设计模式之桥模式(单一职责)(Bridge)1、序论 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的 结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码, 这时候的关键是划清责任。 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度, 乃至多个纬度的变化。 如何应对这种“多维度的变化”?如何利用面向对象技术来使得 类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?模式的定义: 将抽象部分(业务功能)与实现部分(平台实现)分离,使它们 都可原创 2022-01-11 10:47:49 · 70 阅读 · 0 评论 -
C++设计模式之装饰模式(单一职责)(Decorator)
C++设计模式之装饰模式(单一职责)(Decorator)1、序论 在软件组件的设计中,如果责任划分的不清晰,使用继承得到的 结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码, 这时候的关键是划清责任。 在某些情况下我们可能会“过度地使用继承来扩展对象的功能” , 由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性; 并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展 功能的组合)会导致更多子类的膨胀。 如何使“对象功能的扩展”能够根据需要来动态地实现?同时避 免原创 2022-01-11 10:45:04 · 66 阅读 · 0 评论 -
C++设计模式之观察者模式(组件协作)(Observer/Event)
C++设计模式之观察者模式(组件协作)(Observer/Event)1、序论 现代软件专业分工之后的第一个结果是“框架与应用程序的划 分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关 系” ——一个对象(目标对象)的状态发生改变,所有的依赖对 象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密, 将使软件不能很好地抵御变化。 使用面向对象技术,可以将这种依赖关系弱化,并形成一原创 2022-01-10 12:03:42 · 104 阅读 · 0 评论 -
C++设计模式之策略模式(组件协作)(Startegy)
C++设计模式之策略模式(组件协作)(Startegy)1、序论 现代软件专业分工之后的第一个结果是“框架与应用程序的划 分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式 在软件构建过程中,某些对象使用的算法可能多种多样,经常改 变,如果将这些算法都编码到对象中,将会使对象变得异常复杂; 而且有时候支持不使用的算法也是一个性能负担。 如何在运行时根据需要透明地更改对象的算法?将算法与对象本 身解耦,从而避免上述问题?模式的定义: 定原创 2022-01-10 12:02:15 · 569 阅读 · 0 评论 -
C++设计模式之模板方法(组件协作)(Template Method)
C++设计模式之模板方法(组件协作)(Template Method)1、序论 现代软件专业分工之后的第一个结果是“框架与应用程序的划 分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作 结构,但各个子步骤却有很多改变的需求,或者由于固有的原因 (比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变 化或者晚期实现需求?原创 2022-01-10 11:19:37 · 126 阅读 · 0 评论 -
C++设计模式之单例模式
C++设计模式之单例模式(Singleton)1、序论 在软件系统中,经常有这样一些特殊的类,必须保证它在系统中只存在一个实例,才能保证它们的逻辑正确、以及良好的效率如何绕过常规的构造器,提供一种机制来保证一个类只有一个单例对象? 有人说可以提醒用户只构建一个这个对象,但是从设计的角度来说,这应该是设计者的责任,而不是使用者的责任。我们的单例模式就是可以提供这样的功能。模式的定义:保证一个类仅有一个实例,并提供一个该实例的全局访问2、单例模式结构类图3、代码实现class Single原创 2022-01-09 21:59:54 · 329 阅读 · 0 评论 -
C++面向对象编程之设计模式------理解设计原则的相关概念
C++面向对象编程之设计模式------理解设计原则的相关概念深入理解面向对象向下:深入理解三大面向对象机制1> 封装,隐藏内部实现 2> 继承,复用现有代码 3> 多态,改写对象行为向上:深刻把握面向对象机制所带来的抽象意义,理解如何使用 这些机制来表达现实世界,掌握什么是“好的面向对象设计”如何解决复杂性?分解 :人们面对复杂性有一个常见的做法:即分而治之,将大问题分 解为多个小问题,将复杂问题分解为多个简单问题。抽象: 更高层次来讲,人们处理复杂性有一个通用的原创 2022-01-08 19:21:32 · 74 阅读 · 0 评论