GoF 23 种设计模式解析附 C++实现源码
### GoF 23种设计模式解析及C++实现源码详解 #### 0 引言 设计模式作为面向对象编程的重要组成部分,在软件工程领域扮演着至关重要的角色。本文档旨在深入探讨GoF(Gang of Four)所提出的23种经典设计模式,并通过具体的C++实现案例来帮助读者更好地理解和掌握这些模式。 #### 0.1 设计模式解析(总序) 设计模式是解决特定问题的最佳实践,它们为软件设计提供了模板。掌握这些模式不仅能够提高代码的可重用性和可维护性,还能让开发者更加深刻地理解面向对象设计的核心原则。 #### 0.2 设计模式解析后记 通过学习和实践设计模式,开发者能够在遇到类似问题时迅速找到解决方案,从而提高工作效率。本文档不仅详细介绍了每种模式的原理和应用场景,还提供了丰富的C++实现示例。 #### 1 创建型模式 创建型模式关注的是对象的创建方式,主要包括: ##### 1.1 Factory 模式 - **定义**:定义一个用于创建对象的接口,但让子类决定实例化哪一个类。Factory方法使一个类的实例化延迟到其子类。 - **适用场景**:当一个类不知道它所必须创建的对象的确切类的时候;或者需要通过子类来指定所创建的对象的类。 - **优点**:封装了对象创建细节,提高了系统的灵活性。 - **缺点**:当产品族中的种类增加时,工厂也需要相应修改。 ##### 1.2 Abstract Factory 模式 - **定义**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 - **适用场景**:一组相关或相互依赖的对象被一起使用,而具体实现可能会随着环境的不同而变化。 - **优点**:可以创建一系列相关的产品,提高了代码的可扩展性。 - **缺点**:产品族扩展困难,需要修改现有代码。 ##### 1.3 Singleton 模式 - **定义**:确保一个类仅有一个实例,并提供一个全局访问点。 - **适用场景**:需要频繁创建和销毁的对象,或者希望某个类只有一个实例时。 - **优点**:保证系统内存中该类只有一个实例,节省资源。 - **缺点**:破坏了单一职责原则,且不易测试。 ##### 1.4 Builder 模式 - **定义**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 - **适用场景**:当创建复杂对象的算法应该独立于组成该对象的部件以及它们的装配方式时。 - **优点**:隔离了产品的构造和它的组成部分,易于扩展。 - **缺点**:增加了系统的复杂度。 ##### 1.5 Prototype 模式 - **定义**:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 - **适用场景**:当类的实例只能在运行时刻动态确定时,或者创建对象的成本很高时。 - **优点**:可以避免创建对象的开销,提高性能。 - **缺点**:需要为每一个类配备一个原型实例,增加了对象的数量。 #### 2 结构型模式 结构型模式主要关注如何组合类或对象来获得更大的结构,包括: ##### 2.1 Bridge 模式 - **定义**:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 - **适用场景**:如果一个系统需要在构件的抽象化角色和它的实现化角色之间有一个桥梁,那么使用桥接模式非常合适。 - **优点**:实现了抽象和实现的分离,提高了系统的可扩展性。 - **缺点**:增加了理解和设计上的复杂性。 ##### 2.2 Adapter 模式 - **定义**:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 - **适用场景**:当希望复用一些现存的类,但这些类的接口不符合需求时。 - **优点**:可以复用现有的组件,提高了代码的复用性。 - **缺点**:过多的适配器会导致系统变得很复杂。 ##### 2.3 Decorator 模式 - **定义**:动态地给一个对象添加一些额外的职责。就增加功能而言,装饰模式相比生成子类更加灵活。 - **适用场景**:在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 - **优点**:增强了代码的灵活性。 - **缺点**:装饰模式会增加许多小对象。 ##### 2.4 Composite 模式 - **定义**:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。 - **适用场景**:当想要表示对象的部分整体层次结构时。 - **优点**:简化了客户端代码。 - **缺点**:设计比较复杂。 ##### 2.5 Flyweight 模式 - **定义**:运用共享技术有效地支持大量细粒度的对象。 - **适用场景**:当一个应用程序使用了大量的相同或相似的对象,造成很大的存储开销时。 - **优点**:极大地减少内存中对象的数量,节约空间。 - **缺点**:增加了系统的复杂性。 ##### 2.6 Facade 模式 - **定义**:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 - **适用场景**:当一个子系统非常复杂,需要一个简单的接口时。 - **优点**:降低了客户端与子系统之间的耦合度。 - **缺点**:Facade类的逻辑有可能变得较为复杂。 ##### 2.7 Proxy 模式 - **定义**:为其他对象提供一种代理以控制对这个对象的访问。 - **适用场景**:当直接访问对象时会带来不便时。 - **优点**:提高了请求的处理效率。 - **缺点**:增加了额外的代理类,可能会增加系统的复杂度。 #### 3 行为模式 行为模式主要关注对象间的职责分配,包括: ##### 3.1 Template Method 模式 - **定义**:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 - **适用场景**:当各个子类中公共的行为应该被提取出来集中到一个共同的父类中以避免代码重复时。 - **优点**:清晰地定义了扩展点。 - **缺点**:每个不同的实现都需要一个子类。 ##### 3.2 Strategy 模式 - **定义**:定义了一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 - **适用场景**:当一个系统应该动态地在几种算法中选择一种时。 - **优点**:提高了算法的可复用性。 - **缺点**:客户必须了解不同的策略。 ##### 3.3 State 模式 - **定义**:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 - **适用场景**:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。 - **优点**:封装了转换规则。 - **缺点**:状态模式的使用必然会增加系统的类和对象数目。 ##### 3.4 Observer 模式 - **定义**:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - **适用场景**:当一个对象必须通知其他多个对象,而不知道这些对象是谁的时候。 - **优点**:降低了目标与观察者之间的耦合。 - **缺点**:如果一个观察者对象与一个被观察者对象之间存在着循环依赖的话,观察者序列的更新可能会导致递归或无限循环。 ##### 3.5 Memento 模式 - **定义**:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 - **适用场景**:当需要保存/恢复数据时,可以考虑使用备忘录模式。 - **优点**:保持封装边界。 - **缺点**:消耗资源。 ##### 3.6 Mediator 模式 - **定义**:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 - **适用场景**:当一组对象以定义良好但是复杂的方式进行通信时。 - **优点**:降低了类的复杂度。 - **缺点**:不使用中介者类可以很好地运行的系统中引入中介者类只会将其复杂性转移到中介者类中。 ##### 3.7 Command 模式 - **定义**:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 - **适用场景**:当一个操作中包含复杂的子操作时。 - **优点**:降低了调用者与接收者之间的耦合度。 - **缺点**:可能产生大量具体命令类。 ##### 3.8 Visitor 模式 - **定义**:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 - **适用场景**:当需要对一个对象结构中的对象进行很多不同的并且不相关的操作时。 - **优点**:增加新的操作很容易。 - **缺点**:增加新的ConcreteElement类很困难。 ##### 3.9 Chain of Responsibility 模式 - **定义**:为了避免请求发送者与多个请求处理者耦合在一起,将所有的请求的处理者通过前一对象记住其下一个处理者的方式组织起来,并形成一条链。 - **适用场景**:当有多个对象可以处理请求时。 - **优点**:降低了请求的发送者和接收者的耦合。 - **缺点**:增加了系统的复杂性。 ##### 3.10 Iterator 模式 - **定义**:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。 - **适用场景**:当要遍历一个容器时。 - **优点**:简化了集合类。 - **缺点**:增加了对象的数量。 ##### 3.11 Interpreter 模式 - **定义**:给出一个语言的文法,并建立一个解释器来解释由该语言编写的程序。可应用于算术表达式求值等场合。 - **适用场景**:当一个语言需要解释执行,并且可将句子表示为一个抽象语法树时。 - **优点**:易于改变和扩展文法。 - **缺点**:对于复杂文法难以维护。 通过以上详细的介绍,我们可以看到GoF所提出的23种设计模式覆盖了面向对象设计的各个方面,从对象的创建、结构的设计到行为的管理,为软件工程师提供了一套完整的设计工具箱。理解并掌握这些模式,不仅能够提高个人的技术水平,还能显著提升团队的开发效率和软件质量。
- yyzyyx2018-07-23看着还不错,先mark后看
- JUDAS_WXL2017-03-11感谢楼主分享,正好在研究C++的设计模式,好资源。
- 粉丝: 24
- 资源: 17
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助