设计模式学习方法
重构获得模式(Refactoring To Pattern):
- 现代设计特征是需求的频繁变化,而设计模式的关键点就是
寻找变化点
,然后在变化点处使用设计模式
,从而来更好的应对需求变化。
重构关键技法:
不好的做法 | 比较好的做法 | 说明 |
---|
静态绑定 | 动态绑定 | 如:不使用特定的类作为变量,使用抽象类或者接口作为变量 |
早绑定 | 晚绑定 | 如:绑定延迟到子类或者其他类,耦合性低 |
继承 | 组合 | 有时组合比继承可能会更好,“白箱”->“黑箱” |
编译时依赖 | 运行时依赖 | 如:不使用特定的类作为变量,使用抽象类或者接口作为变量 |
紧耦合 | 松耦合 | - |
如何看类图
![分割线](https://i-blog.csdnimg.cn/blog_migrate/1e140a89ea904800ecae41a16ab490e5.gif)
设计模式原则
依赖倒置原则(Dependency Inversion Pattern, DIP)
- 1.高层模块
(稳定层)
不应该依赖低层模块(变化层)
,二者都应该依赖于抽象(稳定,封装变化)
。 - 2.抽象
(稳定)
不应该依赖于实现(变化)
,实现应该依赖于抽象。 - 3.针对接口编程,依赖抽象不依赖具体。
开放封闭原则(Open Close Pattern, OCP)
- 1.对扩展开放,对修改关闭。
- 2.类模块应该是可扩展的,但是不可修改。
单一职责原则(Single Responsibility Pattern, SRP)
- 1.一个类应该只有一个引起她变化的原因。
- 2.变化的方向隐含着类的责任。
Liskov替换原则(Liskov Substitution Pattern, LSP)
- 1.子类必须能够替换他们的基类(is-a关系)。
- 2.继承表达类型抽象。
接口隔离原则(Interface Segregation Pattern, ISP)
- 1.不应该强迫客户端程序依赖它们不使用的方法。
- 2.接口应该小而完备。
封装变化点
- 1.使用封装来创建对象之间的分界层,让设计者可以在分界的一侧进行修改,而不会对另一侧产生不良的影响,从而实现解耦合。
优先使用对象组合,而不是类继承
- 1.类继承通常是白箱复用,对象组合通常是黑箱复用
(继承可能会暴露更多的接口)
。 - 2.继承的子类在某种程度上破坏了封装性,且子类与父类的耦合度较高。
- 3.对象组合只要求被组合的对象具有良好的接口,耦合度较低。
针对接口编程,而不针对实现编程
- 1.不将变量声明为某个特定的具体类,而是声明为某个抽象类或者接口。
- 2.客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。
- 3.减少系统中各部分的依赖关系,从而实现“高内聚,低耦合”的设计。
![分割线](https://i-blog.csdnimg.cn/blog_migrate/1e140a89ea904800ecae41a16ab490e5.gif)
GOF模式分类
延迟:可以理解为定义一个虚函数,让子类去实现或者重写。
从目的划分:
- 1.创建型(creational)模式:
将对象的部分创建工作延迟到子类或者其他对象
,从而应对需求变化为对象创建时具体实现带来的冲击。 - 2.结构型(structural)模式:通过类继承或者对象组合方式获得
灵活的结构
,从而应对需求变化对对象的结构带来的冲击。 - 3.行为型(behavioral)模式:通过类继承或者对象组合的方式来
划分类与对象的职责
,从而应对需求变化为多个交互的对象带来的冲击。
从范围划分:
- 1.类模式处理类与子类的静态关系。
(继承,编译时绑定)
- 2.对象模式处理对象间的动态关系。
(组合,声明对象变量为接口或者抽象类,运行时绑定)
从封装变化角度划分:
模式 | 说明 |
---|
模板方法(Template Method) | 参考Unity(cocos)生命周期 |
策略者模式(Strategy) | - |
观察者模式/事件模式(Observer/Event) | - |
模式 | 说明 |
---|
装饰模式(Decorator) | - |
桥接模式(Bridge) | - |
模式 | 说明 |
---|
简单工厂(simple Factory) | - |
工厂方法(Factory Method) | - |
抽象工厂(Abstruct Factory) | - |
原型链(Prototype) | - |
建造者模式(Builder) | - |
- 4.对象性能:
-
- 面对对象很好的解决了抽象问题,但是不可避免的要付出一定的代价。对于通常情况来讲,面对对象的成本大都可以忽略不计,但是某些情况下,面对对象所带来的成本必须谨慎对待。
模式 | 说明 |
---|
单例模式(Singleton) | - |
享元模式(Flyweight) | 对象池技术 |
模式 | 说明 |
---|
门面模式(Facade) | - |
代理模式(Proxy) | - |
中介模式(Mediator) | - |
适配器模式(Adapter) | - |
模式 | 说明 |
---|
备忘录模式(Memento) | - |
状态机(State) | - |
模式 | 说明 |
---|
组合模式(Composite) | - |
迭代器(Iterator) | - |
责任链模式(Chain Of Responsibility) | - |
模式 | 说明 |
---|
命令模式(Command) | - |
访问者模式(Visitor) | - |
设计模式
单例模式
- 一、概述:
-
- 保证一个类在整个场景中仅有一个实例,且提供了访问该实例的全局访问点。
- 二、例子:
class singleton1
{
public:
static singleton1& I()
{
if (nullptr == _instance) { _instance = new singleton1(); }
return *_instance;
}
private:
static singleton1* _instance;
};
未完、待续
说明
仅作为学习使用。码字一时爽,一直码字一直爽
。
如有侵权,请联系作者删除。
参考:
1.GeekBand视频教程
2.Json_wangqiang的设计模式解密
3.gpp.tkchu.me
4.C语言辅导班-设计模式