一 目标
设计模式主要目标是:可复用,
对于一个好的程序员来说需要懂得如何,向上抽象思维(面向对象,组件封装,设计模式,架构模式),向下理解底层思维(语言构造,编译转换,内存模型,运行时机制)。
而设计模式主要偏向于如何对抽象思维的理解。因为底层的变化不大,而软件最复杂的根本原因其实就是变化。
向下:三大面向对象机制
封装: 隐藏内部实现
继承:复用现有代码
多态:改写对象行为
**向上:**深刻把握面向对象机制所带来的抽象意义,理解如和通过这些机制来表达现实世界,掌握什么是“好的面向对象设计”。
软件设计复杂的根本原因: 变化 (客户需求 技术平台 开发团队 市场环境 的变化)
如何解决复杂性:
分解: 分而治之 将复杂问题分解为多个简单问题
抽象: 更高层次的来讲,由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛华和理想化了的对象模型。 所有设计模式都是围绕抽象来进行各种各样的变化。
二.原则
1.1 单一职责原则:
每个类的职责都应该简单,而不应该很复杂,不要有万能类,万能函数这种设计思想.
1.2 开放封闭原则
对自己封闭: 即不可以修改,但对扩展开放,核心就是多态.
已经封装好的类不再进行修改,而是进行扩展新的类,所以在封装旧的类时,就可以预留一些接口.
1.3 依赖倒置原则
在设计模式中我们一般所说的抽象都是带虚函数的父类,但是这个父类中的虚函数不一定是个纯虚函数,也就意味着不一定是一个抽象类,但是在描述的时候说是一个抽象类.从概念上来讲这个说法是错误的,但是逻辑上能够理解即可.
1.3.1 高层模块不应该依赖底层模块,两个都应该依赖抽象.
高层模块可以理解为写的程序,底层模块可以理解为调用的一些API函数,依赖转换原则是不能直接调用的,而是应该在高层模块和底层模块中间再加一层抽象层.使用时应该是由高层模块调用抽象层,抽象层根据子类的具体类型调用对应的API函数.
1.3.2 抽象不应该依赖细节,细节应该依赖抽象
细节依赖抽象: 细节是通过多态在子类重写父类虚函数的时候实现的.
里氏代换原则:子类类型必须能够替换掉他们的父类类型.
里氏代换原则第一个条件就是继承,其次还要求子类继承的所有父类的属性和方法对于子类来说都是合理的.
如果要满足1.3.2原则 就必须满足里氏代换原则
二 设计模式的分类
创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式