DOING:设计模式及其 C++ 实现

文章目录

  • 总体介绍
  • 设计模式之单例模式(Singleton)
  • 设计模式之观察者模式


总体介绍

我们知道了很多,语法上,算法上,数据结构上的知识,但是这些只是零散的。

当我们要开发一个项目的时候,上面的东西都要用到,类似于士兵,那么我们需要统领他们,就需要有一个 将军。那么设计模式其实就是这个将军的作用

一个模式描述了一个不断发生的问题以及这个问题的解决方案;(是一个总结成 类似 兵法的东西)。
设计模式是前人的设计经验上总结出来的,对于一些普遍存在的问题提供的通用解决方案;比如说,单例模式,观察者模式等等

常用的设计模式,这里我们主要学习,面向对象的常见 23 种设计模式

image

具体所有介绍,也可以看这里:https://www.runoob.com/design-pattern/design-pattern-tutorial.html


设计模式之单例模式(Singleton)

单例模式,就是我们只需要整个程序中,有且只有一个实例(其实就是,有一个东西,在所有进程中都有,而且是共用的)。不会说,一个进程就有一个实例。

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意

  • 1、单例类只能有一个实例
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。(也就是,其他对象,都共用这一个实例)

意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决: 一个全局使用的类频繁地创建与销毁。

何时使用: 当您想控制实例数目,节省系统资源的时候。

如何解决: 判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码: 构造函数是私有的。

应用实例:

  • 1、一个班级只有一个班主任。
  • 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
  • 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

优点:

  • 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  • 2、避免对资源的多重占用(比如写文件操作)。

缺点: 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。


设计模式之观察者模式

在观察者模式中,观察者需要直接订阅目标事件;在目标发出内容改变的事件后,直接接收事件,并作出响应,对象常是 一对多关系。(一个变化,其他收到后作出自己的反应)

例子: 新闻发布会,此时发言人是 目标对象,其他记者 会随着发言人的发言(发生了改变),而作出了响应(其他对象会随着处理自己的具体反应)。

常见场景: 各种 MVC 的框架中,Model 的变化通知各种类型的 View 时,几乎都存在这种模式。

实现思路: 将问题的职责解耦和,将 Observable 和 Observer 抽象开,分清抽象和实体。(也就是,将 目标对象,还有收到目标对象的其他对象,抽象分离开)
Observer 是观察者,一般抽象成纯虚函数的基类(因为多个观察者,但是每个观察者具体的反应不同,这个时候就可以继承,将不同观察者作为不同子类,这样子就可以实现观察者后续不同的反应。这就用到了,基类和子类,还有动态多态的 virtual 的子类函数重写)
Observable 是目标事件(被观察的)成员变量:有一个list 链表,用于记录,观察者的清单。有几个成员函数:增加观察者进观察者清单,将观察者从观察者清单中去除,目标对象的状态改变(只有改变了才通知观察者),通知观察者目标对象已经已经发生改变了。

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的其他对象。观察者模式属于行为型模式。

意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决: 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用: 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

如何解决: 使用面向对象技术,可以将这种依赖关系弱化。

关键代码: 在抽象类里有一个 ArrayList 存放观察者们。

应用实例:

  • 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。
  • 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。
  • 3、新闻发布会,此时发言人是 目标对象,其他记者 会随着发言人的发言(发生了改变),而作出了响应(其他对象会随着处理自己的具体反应)。

你可能感兴趣的:(设计模式)