设计模式(复用性)
文章目录
面向对象设计原则
依赖倒置原则(DIP)、开放封闭原则(OCP)、单一职责原则(SRP)、Liskov替换原则
接口合理原则(ISP)、优先使用对象组合,而不是类继承、封装变化点、针对接口而不是针对实现编程
template method
早绑定<–晚绑定
基类析构函数要是虚函数
策略模式
strategy可以使得类型在运行时方便的根据需要在各个算法之间进行切换(替换if else)
observe观察者模式
装饰模式
运行时装配 利用多态继承
桥模式
父类* a = 子类* b
a->父类的虚函数 即 子类的实现
工厂方法
手段是虚函数
避开依赖具体类
父类* a = 子类* b
a->父类的虚函数 即 子类的实现
class 父类factory{
public:
virtual 父类* Createfactory() = 0;
};
class 子类factor: public 父类factory{
public:
virtual 父类* Createfactory(){
return new 子类();
}
};
父类* a;
Mainform(父类* a){
this->a = a
}
子类* b = 父类->Createfactory();
抽象工厂
一系列相互依赖的对象
原型模式
通过克隆自己来创建对象
构建器
单件模式
singleton
class Singleton{
private:
Singleton();
Singleton(const Singleton& other);
public:
static Singleton* m_instance;
static Singleton* getInstance();
static void createInstance();
};
Singleton* Singleton::m_instance = NULL;
Singleton::createInstance(){
m_instance = New Singleton();
static CGarhuishou c1; //进行析构
}
//双检查锁 防止高并发多线程 但是会reorder 需要volatile
Singleton* Singleton::getInstance(){
if(m_instance == NULL){
unique_lock<mutex> mymutex(resourse_mutex);
if(m_instance == NULL){
createInstance();
}
}
return m_instance;
}
class CGarhuishou{
public:
~CGarhuishou(){
if(Singleton::m_instance){
delete Singleton::m_instance;
Singleton::m_instance = NULL;
}
}
}
享元模式 flyweight
采用共享的对象,具体实现要解决只读问题,适用于多个对象
门面模式 facade
接口隔离模式
代理模式 proxy
代理类和实际类接口是一致的,导致让人觉得是使用实际类
适配器 adapt
父类1ITA 父类2IAD
子类1OLD:父类2
子类2Ade:父类1{父类2,构造函数(父类2){}} (对象有灵活性)
类适配器采用多继承(定死类没有灵活性)很少用
希望复用一些现存类,但是接口又和复用环境要求不一致的情况
中介者 mediator
多个对象相互关联 mediator 解耦系统内的关联关系
state状态模式
备忘录模式
在不破坏对象的封装性的前提下 捕捉 对象的状态
组合模式composite
树结构 以表示整体-部分层次结构
迭代器iterator
在不暴露内部结构的同时,让外部客户代码透明地访问其中包含的元素
(面向对象)虚函数 运行时多态 泛型 编译型多态
职责链chain of resposibility
按链传播职责
命令模式 commend
将请求封装成对象
现在都用泛型编程,函数对象
访问器 visitor
double detach 双重分发
解析器 interpreter
总结
管理变化,提高复用
分解 vs 抽象
八大原则
class A{
B* pb;//指针指向一个松耦合对象,实现多态
}
分开稳定点和变化点