设计模式
- 设计模式是指在软件开发中,经过验证的,⽤于解决在特定环境下,重复出现的,特定问题的解决⽅案;
内存模型
-
继承Base,和成员变量为Base类型的内存模型
-
成员变量为Base指针的内存模型-》实际开发常用这种
-
由于该形式以Base指针的形式存储,展现一种多态的思想
-
而上一种中Base类型和Subject呈现一种强依赖的关系
-
-
父类存在虚函数,子类继承重写虚函数
- 扩展:c语⾔当中的多态-》通过函数指针
- redis
- nginx
- 扩展:c语⾔当中的多态-》通过函数指针
模式设计原则
-
掌握设计原则,而不是设计模式-》设计模式的使用条件有些时候太苛刻
-
八个原则
-
原则1:依赖倒置原则 -》变化点必须依赖稳定点
-
⾼层模块不应该依赖低层模块,⼆者都应该依赖抽象;
-
抽象不应该依赖具体实现,具体实现应该依赖于抽象;
-
⾃动驾驶系统公司是⾼层,汽⻋⽣产⼚商为低层,它们不应该互相依赖,⼀⽅变动另⼀⽅也会跟着变动;⽽应该抽象⼀个⾃动驾驶⾏业标准,⾼层和低层都依赖它;这样以来就解耦了两⽅的变动;⾃动驾驶系统、汽⻋⽣产⼚商都是具体实现,它们应该都依赖⾃动驾驶⾏业标准(抽
象);
-
-
原则2:开放封闭原则
- ⼀个类应该对扩展开放,对修改关闭;
- 扩展:继承-》virtual多态、组合(成员变量指针)-》组合抽象基类;
- ⼀个类应该对扩展开放,对修改关闭;
-
原则3:⾯向接⼝编程
- 不将变量类型声明为某个特定的具体类,⽽是声明为某个接⼝。
- 客户程序⽆需获知对象的具体类型,只需要知道对象所具有的接⼝。
- 减少系统中各部分的依赖关系,从⽽实现“⾼内聚、松耦合”的类型设计⽅案。
-
原则4:封装变化点 -》关键
- 将稳定点和变化点分离,扩展修改变化点;让稳定点与变化点的实现层次分离;
-
原则5:单⼀职责原则
- ⼀个类应该仅有⼀个引起它变化的原因 -》只有一个功能;
-
原则6:⾥⽒替换原则
- ⼦类型必须能够替换掉它的⽗类型;主要出现在⼦类覆盖⽗类实现,原来使⽤⽗类型的程序可能出现错误;覆盖了⽗类⽅法却没实现⽗类⽅法的职责 -》继承时没有实现某些方法;
-
原则7:接⼝隔离原则
- 不应该强迫客户依赖于他们不⽤的⽅法;
- ⼀般⽤于处理⼀个类拥有⽐较多的接⼝,⽽这些接⼝涉及到很多职责;
-
原则8:对象组合优于类继承
- 继承耦合度****⾼,组合耦合度**低;
-
什么情况下使⽤设计模式?
- 系统的关键依赖点;
- 能明确找到变化点;
- 能明确找到复⽤⽅向;
- 对需求变化⽅向熟悉;
如何找到设计模式?
- 从重构中获得;
- 重构
- 静态转变为动态;
- 早绑定转变为晚绑定;
- 继承转变为组合;
- 编译时加载转变为运⾏时加载;
- 紧耦合转变为松耦合;
为什么要学习设计模式?
- 从已有的且证明有效的设计模式中获取灵感,少⾛弯路;
- 通⽤语⾔,知道在已有的设计模式扩展代码;
- 体会模式设计,设计⾃⼰的⾏之有效的设计模式;
学习设计模式的步骤
- 深刻体会上⾯的原则;
- 理解设计模式,能知道设计模式的变化点和稳定点
- 能在已使⽤的设计模式中,知道如何写扩展
- 能在复杂需求中,抽象出已有设计模式;
- 能在重构中,开发⾃⼰的设计模式;
扩展
- 多个子类中重复的流程合并到父类中,变化的流程暴露出去,子类的处理变为单一