设为首页 加入收藏

TOP

23. 面向对象设计模式(一)
2016-10-08 17:31:07 】 浏览:660
Tags:23. 面向 对象 设计模式

23. C++设计模式

面向对象系统的分析和设计实际上追求的就是两点, 一是高内聚(Cohesion),二是低耦合(Coupling)。
面向对象的基本原则:

开闭原则(对扩展开放;对修改封闭):对于扩展是开放的,对于修改是关闭的,一个好的系统是在不修改源代码的情况下,可以扩展你的功能。而实现开闭原则的关键就是抽象化。 里氏代换原则:任何基类可以出现的地方,子类也可以出现。 依赖倒转原则:要依赖抽象,而不要依赖具体的实现。抽象不应当依赖于细节;细节应当依赖于抽象。要针对接口 编程,不针对实现编程。 合成复用原则:要尽量使用合成、聚合,尽量不要使用继承。 一个对象应当对其它对象有尽可能少的了解。系统中的类,尽量不要与其他类互相作用,减少类之间的耦合度。 接口隔离法则:使用多个专门的接口比使用单一的总接口总要好。一个类对另外一个类的依赖性应当是建立在最小接口上的。过于臃肿的接口是对接口的污染。不应该强迫客户依赖于它们不用的方法。

23.1 工厂模式(Factory)

23.1.1 解决问题

创建一个生成对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。比如客户需要一台车子,如果我们知道提前了这个车子的型号,那直接实例化这车子就可以了,但很多情况下,写之前并不知道客户到底要什么车子,所以需要创建一个工厂的接口,这个工厂提供了创建不同类的方法。

23.1.2 适用

当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

23.1.3 问题

Factory类不能是封闭的,比如一但我们新增了车子的型号,同样我们也需要在Factory中添加一个新方法。


23.2 抽象工厂模式

创建一组相关或者相互依赖的对象。抽象工厂相对于工厂更进一步,多了一个工厂抽象类,提供了不同工厂,用于生产不同的产品。
同样是前面的例子,这个时候多了一个品牌厂商的选择。
对于产品来说,有不同的型号,比如小车,卡车、公交车之类
而对于工厂,有不同的品牌,比如大众,长安之类,每个工厂都能生产不同型号的产品。


23.3 Singleton模式

在 Singleton 模式的结构图中可以看到,我们通过维护一个static 的成员变量来记录这个唯一的对象实例。通过提供一个 staitc 的接口 instance 来获得这个唯一的实例。需要说明的是, Singleton 不可以被实例化,因此我们将其构造函数声明为 protected 或者直接声明为 private。
Singleton 模式在开发中经常用到, 且不说我们开发过程中一些变量必须是唯一的,比如说打印机的实例等等。
这里写图片描述
从上面可以看出,单例模式主要有三个要点:

有一个静态成员指针指向本身 构造函数是虚拟的(因此不能实例化) 提供一个公共接口

23.4 Builder模式

23.4.1解决的问题

当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要要复杂对象的创建过程和这个对象的表示(展示)分离开来, 这样做的好处就是通过一步步的进行复杂对象的构建, 由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
还是前面的例子,对于一台车子来说,里面有许多零部件,或者许多建造步骤,
对于客户来说,其完全没有必要知道车子如何建造的,
所以我们可以通过一个建造类,实现将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(在示例代码中可以通过传入不同的参数实现这一点)。

23.4.2 同工厂模式的区别

Builder 模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说 Builder 模式中对象不是直接返回的。而在 AbstractFactory 模式中对象是直接返回的, AbstractFactory 模式强调的是为创建多个相互依赖的对象提供一个同一的接口。


23.5 原型模式Prototype

Prototype 模式提供了一个通过已存在对象进行新对象创建的接口( Clone), Clone()实现和具体子类实现语言相关。
这里写图片描述


23.6 桥接模式Bridge

将抽象部分与它的实现部分分离, 使得它们可以独立地变化。
比如对车(抽象类)来说,其有子类(实现)如小车、卡车、公交等,
现在我们增加特性类比如颜色(抽象类),其有子类(实现)如红色、黄色、紫色
我们可以将这两个类桥连起来(这个关联的方式,可以是类的组合)
这里说的意思不是让抽象基类与具体类分离,而是现实系统可能有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出来让它们独立变化,减少它们之间的耦合性,即如果继承不能实现“开放-封闭原则”的话,就应该考虑用桥接模式。
这里写图片描述


23.7 适配器模式Adapter

Adapter 模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口。比如我们需要给我们电子产品充电,每种电子产品的充电接口并不一定相同,我需要一个适配器,使其能配合我们的电压,这个适配器里实现了不同充电接口的电压转换。
Adapter 模式实现上比较简单,要说明的是在类模式 Adapter 中,我们通过 private 继承Adaptee 获得实现继承的效果, 而通过 public 继承 Target 获得接口继承的效果。
这里写图片描述


23.8 装饰者模式Decorator

我们需要为一个已经定义好的类添加新的职责(操作), 通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题( 将在本模式的讨论中给出)。通过继承的方式解决这样的情况还带来了系统的复杂性,因为继承的深度会变得很深。
一种给类增加职责的方法,不是通过继承实现的,而是通过组合。有关这些内容在讨论中进一步阐述。
比如我们需要给车子装上空调,常规的方法是给车子的子类:小车、卡车、公司等每一个下面都新建一个子类(空调小车之类),
而装饰者模式只需要在车子下新建一个子类装饰者子类,然后在子类中增加空调操作。让 Decorator 直接拥有一个 ConcreteComponent 的引用(指针) 也可以达到修饰的功能, 大家再把这种方式的结构图画出来,就和 Proxy 很相似了。Proxy 模式会提供使用其作为代理的对象一样接口, 使用代理类将其操作都委托给 Proxy 直接进行。
这里写图片描述


23.9 组合模式Composite

在开发中, 我们经常可能要递归构建树状的组合结构, Composite 模式则提供了很好的解决方案。
比如,车由发动机、轮子、车座组成,而轮子又由橡胶圈和转轴等组成。这种递归结构成了组合模式。Composite 模式在实现中有一个问题就是要提供对于子节点( Leaf)的管理策略,这里使用的是 STL 中的 vector,可以提供其他的实现方式,如数组、链表、 Hash 表等。
这里写图片描述


23.10 享元模式Flyweight

Flyweight 模式中有一个类似 Factory 模式的对象构造工厂FlyweightFactory,当客户程序员( Client)需要一个对象时候就会向 FlyweightFactory 发出请求对象的消息 GetFlyweight()消息, FlyweightFactory 拥有一个管理、存储对象的“仓库”(或者叫对象池, vector 实现), GetFlywe

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Item8 Prefer nullptr to 0 and N.. 下一篇C++(二叉树的实现)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目