设计模式
一个模式描述了一个不断发生问题及这个问题的解决方案;模式是前人的设计经验上总结出来的对于一些普遍存在的问题提供的通用解决方案,比如单例模式、观察者模式等;
软件工程中有很多模式,面向对象常见的有23种设计模式,可以分为创建型(单例),结构型(适配器)和行为型(观察者)模型。设计模式不是万能的,它建立在系统变化点上,哪里有变化哪里就可以用。设计模式是为了解耦合,为了扩展,它通常是演变过来的,需要演变才能准确定位。设计模式是一种软件设计方法,不是标准,面目前大部分框架中都包含了大量的设计模式思想。
单例模式
有些时候,我们需要整个程序中有且只有一个实例,比如系统日志、Windows资源管理器窗口,数据库分配主键等操作。单例的实现思路:
- Singleton拥有一个私有的构造函数,确保用户无法通过new直接实例它;
- 包含一个静态私有成员变量instance与静态公有方法Instance(),让外部通过Instance()来获取实例;
1 | //Singleton.h |
1 | //Singleton.cpp |
1 | int main() |
上面的单例模式实现,程序开始时全局实例Singleton* Singleton::This为空,只有我们主动调用Singleton::getInstance()->DoSomething()方法时才会产生这个对象的实例。我们也可以采用饿汉的方式,程序启动时就创建实例:
1 | //Singleton.cpp |
观察者模式
在观察者模式中,观察者需要直接订阅目标事件;在目标发出内容改变的事件后,直接接收事件并作出相应;对象通常是一对多关系。常见于各种MVC的框架中,Model的变化通知各种类型的View时几乎都存在这种模式。
观察者模式的实现思路:把问题的职责解耦合,将Observable和Observer抽象开,分清抽象和实体。
1 | //观察者类 |
用list列表来存储被观察清单。
1 | //被观察对象 |
1 | //main |
观察者模式帮助我们把职责关系梳理清晰了,我们如果要增加一个新的观察者,直接继承一个Observer类,实现一下消息更新的虚方法即可。
适配器(Adapter)模式
适配器模式可以理解为一个插口转换器,去不同国家旅游时可以适配不同的插座接口。适配器将类接口转换为客户端期望的另一个接口,让接口更兼容。适配器模式的动机是:如果可以更改接口,则可以重用现有的软件。
1 | //适配器模式 |