设计模式
文章平均质量分 68
吃米饭
这个作者很懒,什么都没留下…
展开
-
C++设计模式 - 总结
一个目标:管理变化,提高复用掌握设计模式一个核心目标:管理变化,提高复用。在使用设计模式中发现并没有实现复用,这就和设计初衷相违背了,说明代买写的不好。两种手段:分解VS.抽象在代码设计中,该开始想要怎样面向对象先要分解,比如这是梨,这是苹果,这是香蕉建立这杨分解的思维,知道它们不同。但是呢我们很快建立抽象的思维,知道这一类都归属水果,然后就可以在思维管理里面或程序管理里面针对抽象进行统一的管理,比如水果有哪些功能的特征。八大原则依赖倒置原则(DIP)高层模块(稳定)不应该依赖于低层模块(变原创 2022-03-26 18:52:27 · 1044 阅读 · 0 评论 -
C++设计模式 - 解析器模式(Interpreter)
领域规则模式在特定领域中,某些变化虽然频繁,但可以抽象为某种规则。这时候,结合特定领域,将问题抽象为语法规则,从而给出在该领域下的一般性解决方案。典型模式InterpreterInterpreter动机( Motivation )在软件构建过程中,如果某一特定领域的问题比较复杂 ,类似的结构不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。在这种情况下,将特定领域的问题表达为某种语法规则下的句子,然后构建一个解释器来解释这样的句子,从而达到解决问题的目的。模式定义原创 2022-03-25 20:25:18 · 1559 阅读 · 0 评论 -
C++设计模式 - 访问器模式(Visitor)
行为变化模式在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化” 模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。典型模式CommandVisitorVisitor动机( Motivation )在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法) , 如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下,在运行时根据需要 透明地为类层次结构.原创 2022-03-25 18:44:36 · 190 阅读 · 0 评论 -
C++设计模式 - 命令模式(Command)
行为变化模式在组件的构建过程中,组件行为的变化经常导致组件本身剧烈的变化。“行为变化” 模式将组件的行为和组件本身进行解耦,从而支持组件行为的变化,实现两者之间的松耦合。典型模式CommandVisitorCommand动机( Motivation )在软件构建过程中,“行为请求者” 与"行为实现者”通常呈现一种“紧耦合”。但在某些场合一比如需 要对行为进行“记录、撤销/重(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与原创 2022-03-25 17:55:59 · 446 阅读 · 0 评论 -
C++设计模式 - 职责链模式(Chain of Resposibility)
数据结构模式常常有一-些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。典型模式CompositeIteratorChain of ResposibilityChain of Resposibility动机( Motivation )在软件构建过程中, -个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果原创 2022-03-22 23:23:55 · 173 阅读 · 0 评论 -
C++设计模式 - 迭代器模式(Iterator)
数据结构模式常常有一-些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。典型模式CompositeIteratorChain of ResposibilityIterator动机( Motivation )在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代原创 2022-03-22 22:15:57 · 1067 阅读 · 0 评论 -
C++设计模式 - 组合模式(Composite)
数据结构模式常常有一-些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。典型模式CompositeIteratorChain of ResposibilityComposite动机( Motivation )在软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象接口)的变化将引起原创 2022-03-22 21:42:39 · 1829 阅读 · 0 评论 -
C++设计模式 - 备忘录模式(Memento)
状态变化模式在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。典型模式StateMementoMemento动机(Motivation)在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封原创 2022-03-22 18:51:15 · 679 阅读 · 0 评论 -
C++设计模式 - 状态模式(State)
状态变化模式在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。典型模式StateMemento动机(Motivation)在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?模式定义允许一个对象在其内部状态原创 2022-03-22 18:34:10 · 309 阅读 · 0 评论 -
C++设计模式 -中介者模式(Mediator)
接口隔离模式在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式FacadeProxyAdapterMediatorMediator动机( Motivation )在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系 ,如果遇到一-些需求的更改,这种直接的引|用关系将面临不断的变化。在这种情况下,我们可使用一个“中介对象”来管原创 2022-03-21 22:29:56 · 409 阅读 · 0 评论 -
C++设计模式 - 适配器模式(Adapter)
接口隔离模式在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式FacadeProxyAdapterMediatorAdapter动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”? 如何既能利用现有对象的良好实现,同时又能满足新的应用原创 2022-03-21 19:18:31 · 938 阅读 · 0 评论 -
C++设计模式 - 代理模式(Proxy)
接口隔离模式在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式FacadeProxyAdapterMediatorProxy动机(Motivation)在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者 需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象原创 2022-03-21 17:27:17 · 659 阅读 · 0 评论 -
C++设计模式 - 门面模式(Facade)
接口隔离模式在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。典型模式FacadeProxyAdapterMediatorFacade系统间耦合的复杂度动机(Motivation)上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客原创 2022-03-21 17:26:37 · 288 阅读 · 0 评论 -
C++设计模式 - 桥模式(Bridge)
单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。典型模式DecoratorBridgeBridge动机(Motivation)由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?模式定义将抽象部分(业务功能)与实现部分(平台实现)原创 2022-03-19 22:01:30 · 463 阅读 · 0 评论 -
C++设计模式 - 装饰器(Decorator)
单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。典型模式DecoratorBridgeDecorator动机(Motivation)在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来原创 2022-03-19 21:05:20 · 1144 阅读 · 1 评论 -
C++设计模式 - 观察者模式(Observer)
组件协作模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式Template MethodStrategyObserver / EventObserver动机(Motivation)在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地原创 2022-03-18 23:39:08 · 300 阅读 · 0 评论 -
C++设计模式 - 策略模式(Strategy)
组件协作模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式Template MethodObserver / EventStrategyStrategy动机(Motivation)在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更原创 2022-03-18 21:38:29 · 270 阅读 · 1 评论 -
C++设计模式 - 模板方法(Template Method)
组件协作模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式Template MethodObserver / EventStrategyTemplate Method 模式动机(Motivation)在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实原创 2022-03-18 19:54:20 · 467 阅读 · 0 评论 -
C++设计模式 - 建造者模式(Builder)
对象创建模式通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式Factory MethodAbstract FactoryPrototypeBuilderBuilder动机(Motivation)在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相原创 2022-03-15 01:10:06 · 863 阅读 · 0 评论 -
C++设计模式 - 原型模式(Prototype)
对象创建模式通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式Factory MethodAbstract FactoryPrototypeBuilderPrototype动机在软件系统中,经常面临着“某些结构复杂的对象’的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“原创 2022-03-14 19:05:54 · 925 阅读 · 0 评论 -
C++设计模式 - 抽象工厂(Abstract Factory)
对象创建模式通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式Factory MethodAbstract FactoryPrototypeBuilderAbstract Factory动机(Motivation)在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象创建方法(new原创 2022-03-14 18:19:15 · 339 阅读 · 0 评论 -
C++设计模式 - 工厂方法(Factory Method)
对象创建模式通过“对象创建”模式绕开new ,来避免对象创建( new )过程中所导致的紧耦合(依赖具体类) , 从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式Factory MethodAbstract FactoryPrototypeBuilder工厂方法(Factory Method)在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序原创 2022-03-13 23:54:28 · 499 阅读 · 0 评论 -
C++设计模式 - 享元模式(Flyweight)
享元模式:运用共享技术有效地支持大量细粒度的对象。动机在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价一主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?总结面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体我们需要考 虑对象的代价问题。Flyweight主要解决面向对象的代价问题,一般不触及 面向对象的抽象性问题。Flyweight采用对象共享的做法来降原创 2022-03-12 19:42:34 · 1229 阅读 · 0 评论 -
C++设计模式 - 单例模式(Singleton)
单例模式其意图是:保证一个类只有一个实例,并提供一个访问它的全局访问点。为了防止外部类构造实例,需要将构造函数的访问权限标记为protected或private;需要提供全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。线程非安全版本#include <iostream>class Singleton{private: Singleton(){ std::cout<<"constructor called!"<原创 2022-03-12 19:28:51 · 1927 阅读 · 0 评论 -
设计模式 - 分类
GOF-23 模式分类从目的来看:创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。行为型(Behavioral)模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来的冲击。从范围来看:类模式处理类与子类的静态关系。对象模式处理对象间的动态关系。从封装变原创 2022-02-04 15:36:20 · 108 阅读 · 0 评论 -
设计模式 - 面向对象设计原则
什么是设计模式“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。——Christopher Alexander深入理解面向对象抽象思维:向上,如何将我们的周围世界抽象为程序代码面向对象组件封装设计模式架构模式底层思维:向下,如何把握机器底层从微观理解对象构造语言构造编译转换内存模型运行时机制向下:深入理解三大面向对象机制封装,隐藏内部实现继承,复用现有代码多态,改写对原创 2022-02-04 15:21:47 · 122 阅读 · 0 评论