一、设计模式
设计模式指人们在日常开发中对常见问题的解决方法的一个合集。特定模式通常为特定场景下的一种最佳解决方案,其本质是为了增强代码的可读性、可维护性以及健壮性。
二、七大原则
- 单一职责原则(Single Responsibility Principle):一个类或者一个方法只负责一项职责。职责越多,功能实现越复杂,修改维护越容易出错。
- 开闭原则(Open Close Principle):对扩展开放,对修改关闭。因为修改已有代码可能造成大范围影响甚至不可控,而新增代码的影响一般较小且可控。
- 里氏代换原则(Liskov Substitution Principle):任何基类可以出现的地方,子类一定可以出现。要求父、子类中存在相同函数时,则该函数必须是虚函数。在实践中抽象借助虚函数实现。
- 依赖倒转原则(Dependence Inversion Principle):针对接口编程,依赖于抽象而不依赖于具体。对处理逻辑分层处理,层与层之间采用接口(抽象方法)进行交互。
- 接口隔离原则(Interface Segregation Principle):使用多个隔离的接口,比使用单个接口要好。过于复杂的接口,应改为多个简单的接口。
- 迪米特法则,又称最少知道原则(Demeter Principle):即最少知道原则。一个实体对外暴露(知道)的越少,就越独立。
- 合成复用原则(Composite Reuse Principle):尽量使用合成/聚合的方式,而非继承。因为继承会将父类的方法暴露,父类一旦改变,子类也不得不改变。
三、三大类别
设计模式主要有23种,可分为:创建型、结构型和行为型三个类别。
- 创建型:创建指的是对象的创建(即:new 对象),针对特定情况,可创建出不同类型和数量的对象,隐藏对象的创建逻辑。
- 结构型:结构指的是不同对象间的结构,不同对象间的结构关系包含继承、组合、聚合等,对象间的结构关系合理是整个程序合理的基石。
- 行为型:行为指的是对象间的行为(即:通信),不同对象间的联动关系,谁触发谁。
四、模式详情
建造者模式:
- 工厂模式:暴露对象创建接口给客户端,客户端调用该接口来创建不同对象,并用抽象类统一操作不同类型的实例对象。
- 抽象工厂模式:对工厂进行抽象后得到一个抽象工厂类,抽象工厂类可含多个对象创建方法、也可派生出多种不同的工厂子类。
- 单例模式:确保只创建一个实例且提供访问该单一实例的方法。
饿汉式:提前实例化(通常使用全局变量,main函数之前),无需上锁。
懒汉式:第一次使用时才初始化,多线程调用时为了确保只创建一个实例需要上锁,可采用双重校验锁优化;C++11静态变量的初始化是线程安全的,可使用静态变量代替上锁。 - 建造者模式:将多个简单对象构建成一个复杂对象,需要建造(复杂对象的)过程稳定。通过选择不同的简单对象,使得相同的构建过程可得到不同的成品,即:同样的构建过程可以创建不同的表示。
- 原型模式:用一个原型接口来客隆指定对象。
结构型模式
- 适配器模式:在接口不兼容的对象或系统之间实现一套中间接口使其能够一起工作。
- 桥接模式:把抽象与实现分离可解决类爆炸的问题,分离的方式是将继承改为组合或聚合。
- 过滤器模式(或标准模式):对象有多种过滤标准,则可将过滤标准抽象。
- 组合模式(或部分整体模式):用组合来表示对象间的整体与部分的层次关系(如:树形关系)。
- 装饰器模式:对现有类进行包装或扩展(如:增加属性和方法)以满足需求。
- 外观模式:新增访问系统的接口以便隐藏现有系统的复杂性,使系统更加易于使用。
- 享元模式:共享对象可减少对象的创建数量,达到减少内存占用、提高性能的目的。
- 代理模式:用一个类作为另外一个类的代表并对外提供服务,可用于权限控制。
行为型模式
- 责任链模式:一个请求有多个可能处理的对象,但最终只会有一个对象对请求进行处理,则可将多个可能处理请求的对象连接成一条链,让请求在链上传播,直到请求被处理为止。
- 命令模式:将命令对象化,由对应的对象执行命令。可用于包含撤销、重做的场景。
- 解释器模式:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
- 迭代器模式:提供一种方法使得可以顺序访问对象中的元素,而无需关注对象的内部表示。
- 中介者模式:引入一个中介者,将现有多个对象间的一对多通信模式改造成与中介者的一对一通信模式。
- 备忘录模式:获取对象的内部状态并在内外进行保存,在适当的时候进行对象恢复。
- 观察者模式:一个对象被修改后,自动通知依赖于它的多个对象。
- 状态模式:对象内部状态发生变化时,同步改变其行为。
- 空对象模式:用空对象取代 NULL 对象实例的检查。
- 策略模式:将不同算法封装,使得不同算法在运行时可彼此替换。
- 模板模式:定义算法骨架,部分特性延迟到子类实现,使得子类在不改变算法结构的情况下即可实现特定功能。
- 访问者模式:将易变的访问操作(函数方法)与数据(类本身)相分离。
- MVC模式(odel-View-Controller):适用于应用程序的分层开发。