添加设计模式及例子,包括:单例、抽象工厂、适配器、桥接、观察者模式

This commit is contained in:
huihut
2018-07-22 14:50:54 +08:00
parent 92bc715c1f
commit b69685a5a7
31 changed files with 839 additions and 31 deletions

View File

@@ -0,0 +1,34 @@
//
// Created by xiemenghui on 2018/7/21.
//
#include "ObserverMain.h"
void ObserverMain()
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ConcreteSubject * pSubject = new ConcreteSubject();
// <20><><EFBFBD><EFBFBD><EFBFBD>۲<EFBFBD><DBB2><EFBFBD>
IObserver * pObserver1 = new ConcreteObserver("Jack Ma");
IObserver * pObserver2 = new ConcreteObserver("Pony");
// ע<><D7A2><EFBFBD>۲<EFBFBD><DBB2><EFBFBD>
pSubject->Attach(pObserver1);
pSubject->Attach(pObserver2);
// <20><><EFBFBD>ļ۸񣬲<DBB8>֪ͨ<CDA8>۲<EFBFBD><DBB2><EFBFBD>
pSubject->SetPrice(12.5);
pSubject->Notify();
// ע<><D7A2>һ<EFBFBD><D2BB><EFBFBD>۲<EFBFBD><DBB2><EFBFBD>
pSubject->Detach(pObserver2);
// <20>ٴθ<D9B4><CEB8><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>֪ͨ<CDA8>۲<EFBFBD><DBB2><EFBFBD>
pSubject->SetPrice(15.0);
pSubject->Notify();
SAFE_DELETE(pObserver1);
SAFE_DELETE(pObserver2);
SAFE_DELETE(pSubject);
}

View File

@@ -0,0 +1,17 @@
//
// Created by xiemenghui on 2018/7/21.
//
#ifndef DESIGNPATTERN_OBSERVERMAIN_H
#define DESIGNPATTERN_OBSERVERMAIN_H
#include "concrete_subject.h"
#include "concrete_observer.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=nullptr;} }
#endif
void ObserverMain();
#endif //DESIGNPATTERN_OBSERVERMAIN_H

View File

@@ -0,0 +1,25 @@
//
// Created by xiemenghui on 2018/7/21.
//
#ifndef DESIGNPATTERN_CONCRETE_OBSERVER_H
#define DESIGNPATTERN_CONCRETE_OBSERVER_H
#include "observer.h"
#include <iostream>
#include <string>
class ConcreteObserver : public IObserver
{
public:
ConcreteObserver(std::string name) { m_strName = name; }
void Update(float price)
{
std::cout << m_strName << " - price" << price << "\n";
}
private:
std::string m_strName; // 名字
};
#endif //DESIGNPATTERN_CONCRETE_OBSERVER_H

View File

@@ -0,0 +1,45 @@
//
// Created by xiemenghui on 2018/7/21.
//
#ifndef DESIGNPATTERN_CONCRETE_SUBJECT_H
#define DESIGNPATTERN_CONCRETE_SUBJECT_H
#include "subject.h"
#include "observer.h"
#include <iostream>
#include <list>
// 具体主题
class ConcreteSubject : public ISubject
{
public:
ConcreteSubject(){ m_fPrice = 10.0; }
void SetPrice(float price)
{
m_fPrice = price;
}
void Attach(IObserver * observer)
{
m_observers.push_back(observer);
}
void Detach(IObserver * observer)
{
m_observers.remove(observer);
}
// 通知所有观察者
void Notify()
{
std::list<IObserver *>::iterator it = m_observers.begin();
while (it != m_observers.end())
{
(*it)->Update(m_fPrice);
++it;
}
}
private:
std::list<IObserver *> m_observers; // 观察者列表
float m_fPrice; // 价格
};
#endif //DESIGNPATTERN_CONCRETE_SUBJECT_H

View File

@@ -0,0 +1,15 @@
//
// Created by xiemenghui on 2018/7/21.
//
#ifndef DESIGNPATTERN_OBSERVER_H
#define DESIGNPATTERN_OBSERVER_H
// 抽象观察者
class IObserver
{
public:
virtual void Update(float price) = 0; // 更新价格
};
#endif //DESIGNPATTERN_OBSERVER_H

View File

@@ -0,0 +1,18 @@
//
// Created by xiemenghui on 2018/7/21.
//
#ifndef DESIGNPATTERN_SUBJECT_H
#define DESIGNPATTERN_SUBJECT_H
class IObserver;
class ISubject
{
public:
virtual void Attach(IObserver *) = 0; // 注册观察者
virtual void Detach(IObserver *) = 0; // 注销观察者
virtual void Notify() = 0; // 通知观察者
};
#endif //DESIGNPATTERN_SUBJECT_H