一、UML类图:
类与类之间存在6个关系:
1)依赖:类A用到了类B,不是成员变量中用到,而是在成员函数中用到了
2)关联:类A使用了类B,并且是在成员变量中用到的
3)聚合:和关联类似,也是使用实例化来关联,一个是整体,一个是部分
4)组合:相比聚合具有更强的耦合度。部分没有单独存在的意义,整体负责单独的生命周期。
5)继承:
6)实现:纯虚函数
二、策略模式:
strategy中的算法经常变化。所以将strategy中的算法作为虚函数,在派生类中进行重写。Context中包含了一个strategy对象的指针,可以根据需求将该指针指向ABC类。需要添加算法的时候,只要添加派生类,context和strategy不需要修改。
class Strategy{virtual AlgorithmInterface()=0;};class A:public Strategy{AlgorithmInterface();};class B:public Strategy{AlgorithmInterface();};class C:public Strategy{AlgorithmInterface();};Class Context{Strategy* strategy;//包含了一个Strategy的指针void ContextInterface(){strategy->AlgorithmInterface();//根据对象类型创建算法}
三、单例模式:保证一个类只有一个实例
1)懒汉版本:不到万不得已就不会去实例化类,第一次用到类实例的时候才会去实例化
2)饿汉:饥不择食,在单例类定义的时候就进行实例化
懒汉版本:
class Singleton{public:static Singleton* m_instance;static Singleton* getInstance();//在调用这个函数之前没有实例化对象,所以要写成静态函数private://将构造函数和析构函数私有化static mutex SingletonMutex;//静态函数只能调用静态变量Singleton() {};~Singleton() {};};static Singleton::m_instance = nullptr;static Singleton* Singleton::getInstance() {if (m_instance == nullptr) {//因为lock会造成效率降低,因此在先判断是否被实例化,SingletonMutex.lock();if (m_instance == nullptr) {m_instance = new Singleton();}SingletonMutex.unlock();}return m_instance;}
为什么要判断两次nullptr?
当类没有被实例话的时候,两个进程同时通过了第一个nullptr,一个线程加锁并且实例化,解锁后另一个线程也会实例化。因此要两次判断。
饿汉版本:
class Singleton{public:static Singleton* m_instance;static Singleton* getInstance();private:Singleton() {};~Singleton() {};};static Singleton::m_instance = new Singleton();//在定义的时候就被实例化,所以是线程安全的static Singleton* Singleton::getInstance() {return m_instance;}
四、工厂方法模式:
简单工厂模式,工厂类包含了逻辑判断,会根据输入来判断实例化哪一个类,但是如果要添加类的时候,需要需改工厂类,违背了开放—封闭原则。因此工厂方法定义了抽象类用于实例化对象的纯虚函数,他的子类来负责实例化
class ISplitter{public:ISplitter();virtual ~ISplitter(); virtual void split() = 0;};class PictureISplitter:public ISplitter{public:PictureISplitter();virtual ~PictureISplitter();virtual void split() {};};class BinaryISplitter:public ISplitter{public:BinaryISplitter();virtual ~BinaryISplitter();virtual void split() {};};class SplitterFactory{public:SplitterFactory();virtual ~SplitterFactory();virtual ISplitter* createSplitter() = 0;};class PictureSplitterFactory:public SplitterFactory{public:PictureSplitterFactory();virtual ~SplitterFactory();virtual ISplitter* createSplitter{return new PictureISplitter();}};class BinarySplitterFactory :public SplitterFactory{public:BinarySplitterFactory();virtual ~BinarySplitterFactory();virtual ISplitter* createSplitter{return new BinaryISplitter();}};
五、抽象工厂模式:
之前的工厂模式product只有一个,当product有多个的时候,并且product的派生类之间有依赖关系的时候,则可以用同一个具体工厂同时创建这些对象
六、观察者模式:
定义了一对多的依赖关系,多个观察者对同一个对象进行观察,当被观察对象发生了改变会通知所有的观察者,观察者会根据这个进行相应的措施。