软件设计模式(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;
}