软件设计模式(23种可复用)
一、单例模式:整个程序中有且只有一个实例
1、常见场景:系统日志、windows资源管理窗口、数据库分配主键操作
2、代码
Singleton.h
#pragma once #include"stdafx.h" class Singleton { public: static const Singleton* getInstance(); static void DoSomething() { cout << "Do something" << endl; } //构造和析构函数私有化,防止外部访问 private: Singleton(); ~Singleton(); static Singleton* This;//使用静态变量帮助解决资源分配和释放 };
Singleton.cpp
#include "Singleton.h" #include"stdafx.h" //Singleton* Singleton::This = nullptr; 或者如下 Singleton* Singleton::This = new Singleton(); const Singleton * Singleton::getInstance() { if (!This) { This = new Singleton(); } return This; } Singleton::Singleton() { } Singleton::~Singleton() { }
main
#include"stdafx.h" #include "Singleton.h" int main() { Singleton::getInstance()->DoSomething(); return 0; }
二、观察者模式: 在观察者模式中,观察者需要直接订阅目标事件;在目标发出内容改变的事件后,直接接收事件并作出相应,对象常是一对多的关系
1、常见场景:各种MVC框架中,Model的变化通知,各种类型的View时几乎都存在这种模式
2、代码
观察者.h文件
#pragma once #ifndef OBSERVER_H_1 #define OBSERVER_H_1 class Observer { public: Observer() { ; } virtual ~Observer() { ; } //当被观察对象发生变化时,通知被观察者调用这个方法 virtual void Update(void* pArg) = 0; }; #endif // !OBSERVER_H_1
被观察者.h文件(list是链表;注意第二行加的class Observer;)
#pragma once class Observer; #include<string> #include<list> class Observeravle { public: Observeravle(); virtual ~Observeravle(); //注册观察者 void Attach(Observer* pOb); //反注册观察者 void Detach(Observer* pOb); int GetObserverCount() const { return _Obs.size(); } void DetachAll() { _Obs.clear(); } virtual void GetSomeNews(std::string str) { SetChange(str); } protected://继承类可见 void SetChange(std::string news); private: void Notify(void* pArg); private: std::list<Observer*> _Obs; bool _bChange; };
被观察者.cpp文件
#include "Observerable.h" #include "Observer.h" Observeravle::Observeravle():_bChange(false) { } Observeravle::~Observeravle() { } void Observeravle::Attach(Observer * pOb) { if (pOb == nullptr) { return; } auto it = _Obs.begin(); for (; it != _Obs.end(); ++it) { if (*it == pOb) return; } _Obs.push_back(pOb); } void Observeravle::Detach(Observer * pOb) { if (pOb == nullptr||_Obs.empty()) { return; } _Obs.remove(pOb); } void Observeravle::SetChange(std::string news) { _bChange = true; Notify(((void*)news.c_str())); } void Observeravle::Notify(void * pArg) { if (_bChange == false) { return; } auto it = _Obs.begin(); for (; it != _Obs.end(); ++it) { (*it)->Update(pArg); } _bChange = false; }
main测试例子
#include"stdafx.h" class News : public Observeravle { public: void GetSomeNews(std::string str) { SetChange("News:" + str); } }; class User1 :public Observer { public: void Update(void* pArg) { cout << "User1 Got News;"<<(char*)pArg << endl; } }; class User2 :public Observer { public: void Update(void* pArg) { cout << "User2 Got News;" <<(char*)pArg << endl; } }; int main() { User1 u1; User2 u2; News n1; n1.GetSomeNews("T1"); cout << n1.GetObserverCount()<<endl; n1.Attach(&u1); n1.Attach(&u2); n1.GetSomeNews("T2"); cout << n1.GetObserverCount() << endl; n1.Detach(&u2); n1.GetSomeNews("T3"); cout << n1.GetObserverCount() << endl; n1.DetachAll(); n1.GetSomeNews("T4"); cout << n1.GetObserverCount() << endl; return 0; }