C++设计模式
从面向对象谈起
底层思维: 语言构造、编译转换、内存模型、运行时机制
抽象思维 :面向对象、组件封装、设计模式、架构模式
深入理解面向对象
向下: 深入理解三大面向对象机制
1.封装,隐藏内部实现
2.继承,复用现有代码
3.堕胎,改写对象行为
向上: 深刻把握面向对象机制所带来的抽象意义,理解如何使用这些机制来表达现实世界,掌握什么是好的“面向对象设计”
重新认识面向对象
理解隔离变化
从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响最小
各司其职
从微观层面来看,面向对象的方式更强调各个类的“责任”;
由于需求变化导致新增类型不应该影响原来类型的实现–是所谓各司其职
对象
从语言实现层面,对象封装了代码和数据;
从规格层面来看,对象是一系列可被使用的公共接口;
从概念层面讲,对象是某种拥有责任的抽象。
设计原则
1.依赖倒置原则(DIP):
高层模块(稳定)不应该依赖于底层模块(变化),二者都应该改依赖于抽象(稳定)
抽象(稳定)不应该依赖于实现细节(变化),实现细节应该依赖于抽象(稳定)。
2.开放封闭原则(OCP) :
对扩展开放,对更改封闭;
类模块应该是可扩展的,但是不可修改!
3.单一职责原则(SRP) :
一个类应该仅有一个引起它变化的原因;
变化的方向隐含类的责任。
4.Liskov替换原则(LSP):
子类必须能够替换他们的基类(IS-A);
继承表达类型抽象。
5.接口隔离原则(ISP) :
不应该强迫客户程序依赖它们不用的方法;
接口应该小而完备
6.优先使用对象组合,也不是使用类继承
类继承通常为“白箱复用”,对象组合通常为“黑箱复用”;
继承在某种程度上破坏了封装性,子类父类耦合度高;
而对象组合只需要被组合的对象具有良好定义的接口定义
7.封装变化点
使用封装来创建对象之间的分界层,让设计者可以在分界层,一侧进行修改,
而不会对另一侧产生不良影响,从而实现层次间的松耦合;
8.针对接口编程,而不是针对实现编程
不将变量类型声明为某个特定的具体类,而是声明为某个接口;
客户程序无需获知对象的具体类型,只需要知道对象所具有的接口;
减少系统中各部分的依赖关系,实现“高内聚、松耦合”的类型设计方案;
将设计原则提升为设计经验
1.设计习语
2.设计模式
3.架构模式
模式分类
重构获得模式
“组件协作模式”
Template Method模式
结构化设计:
//程序库开发人员
class Library {
public:
void Step1() {
//...
}
void Step3() {
//...
}
void Step5() {
//...
}
};
//应用程序开发人员
class Application {
public:
bool Step2() {
//...
}
void Step4() {
//...
}
};
int main() {
Library lib;
Application app;
lib.Step1();
if (app.Step2()) {
lib.Step3();
}
for (int i = 0; i < 4; ++i) {
app.Step4();
}
lib.Step5();
}
面向对象软件设计流程:
//程序库开发人员
class Library {
public:
//稳定 template method
void run() {
Step1();
if (Step2()) {
Step3();
}
for (int i = 0; i < 4; ++i) {
Step4();
}
Step5();
}
virtual ~Library() {};
protected:
void Step1() { //稳定
//...
}
void Step3() { //稳定
//...
}
void Step5() { //稳定
//...
}
virtual bool Step2() = 0; //变化
virtual void Step4() = 0;//变化
};
class Application :public Library {
protected:
virtual bool Step2() {
//...子类重写实现
}
virtual void Step4() {
//...子类重写实现
}
};
int main() {
Library* pLib = new Application();
pLib->run();
delete pLib;
}
体系结构:
Strategy模式
下面是违背开放封闭原则的设计,更改时候直接改了源代码,而不是进行扩展,还需要重新编译,测试
enum TaxBase {
CN_Tax,
US_Tax,
DE_tax,
FR_tax //更改
};
class SalesOrder {
TaxBase tax;
public:
double CalculateTax() {
//....
if (tax == CN_Tax) {
//...
}
else if (tax == US_Tax) {
//...
}
else if (tax == DE_tax) {
//...
}
else if(tax == FR_tax){ //更改
//...
}
}
//...
};
面向对象设计:
class TaxStrategy {
public:
virtual double Calculate(const Context& context) = 0;
virtual ~TaxStrategy();
};
class CNTax :public TaxStrategy {
public:
virtual double Calculate(const Context& context) {
//中国税法
}
};
class USTax :public TaxStrategy {
public:
virtual double Calculate(const Context& context) {
//美国税法
}
};
class DETax :public TaxStrategy {
public:
virtual double Calculate(const Context& context) {
//德国税法
}
};
//扩展更改
class FRTax :public TaxStrategy {
public:
virtual double Calculate(const Context& context) {
//法国税法
}
};
class SalesOrder {
private:
TaxStrategy* strategy;
public:
SalesOrder(StrtegyFactory* str) {
this->strategy = str->NewStrategy();
}
~SalesOrder() {
delete this->strategy;
}
public double CalculateTax() {
//...
Context context();
double val = strategy->Calculate(context); //多态调用
//...
}
};
体系结构:
Observer / Event模式
观察者模式案例:
#include <string>
#include <iostream>
#include <vector>
#include <list>
class IProgress {
public:
virtual void DoProgress(float value) = 0;
virtual ~IProgress();
};
class ConsoleNotifier:public IProgress {
public:
virtual void DoProgress(float value) {
std::cout << ".";
}
};
class MainForm : public Form, public IProgress{
TextBox* txtFilePath;
TextBox* txtFileNumber;
ProgressBar* progressBar; //通知控件
public:
void Button1_Click() {
std::string filePath = txtFilePath->getText();
int number = atoi(txtFileNumber->getText().c_str());
ConsoleNotifier cn;
FileSplitter splitter(filePath, number);
splitter.add_IProgress(this); //加入次观察者,订阅通知
splitter.add_IProgress(&cn); //加入其他观察者,订阅通知
splitter.split();
}
virtual void DoProgress(float value) {
progressBar->setValue(value);
}
};
class FileSplitter {
std::string m_filePath;
int m_fileNumber;
//ProgressBar* m_progressBar; //通知控件
std::list <IProgress* > m_iprogressList; //抽象通知机制,支持多个观察者
public:
//FileSplitter(const std::string& filePath, int fileNumber, ProgressBar* progressBar) :
// m_filePath(filePath),
// m_fileNumber(fileNumber),
// m_progressBar(progressBar) {
//}
FileSplitter(const std::string& filePath, int fileNumber) :
m_filePath(filePath),
m_fileNumber(fileNumber) {
}
void add_IProgress(IProgress* iprogress) {
m_iprogressList.add(iprogress);
}
void remove_IProgress(IProgress* iprogress) {
m_iprogressList.remove(iprogress);
}
void split() {
//1.读取文件
//2.分批次向小文件写入
for (int i = 0; i < m_fileNumber; ++i) {
//....
//if (m_progressBar != nullptr) {
// m_progressBar->setvalue((i + 1) * 100.0 / m_fileNumber);
//}
float progressValue = m_fileNumber;
progressValue = (i + 1) / progressValue;
onProgress(progressValue); //发送通知
}
}
protected:
void onProgress(float progressValue) {
auto start = m_iprogressList.begin();
while (start != m_iprogressList.end()) {
(*start)->DoProgress(progressValue); //更新进度条
start++;
}
}
};
装饰模式
"单一职责"模式
Decorator
案例:
//业务操作
class Stream {
public:
virtual char Read(int number) = 0;
virtual void Seek(int position) = 0;
virtual void Write(char data) = 0;
virtual ~Stream();
};
//主体类
class FileStream : public Stream {
public:
virtual char Read(int number) {
//读文件流
}
virtual void Seek(int position) {
//定位文件流
}
virtual void Write(char data) {
//写文件流
}
};
//扩展操作
class CryptoFileStream : public FileStream {
public:
virtual char Read(int number) {
//额外加密操作
FileStream::Read(number);//读文件流
}
virtual void Seek(int position) {
//额外加密操作
FileStream::Seek(position);//定位文件流
}
virtual void Write(char data) {
//额外加密操作
FileStream::Write(data);//写文件流
}
};
class BufferreadStream :public FileStream {
public:
virtual char Read(int number) {
//额外加密操作
FileStream::Read(number);//读文件流
}
virtual void Seek(int position) {
//额外加密操作
FileStream::Seek(position);//定位文件流
}
virtual void Write(char data) {
//额外加密操作
FileStream::Write(data);//写文件流
}
};
void Progress() {
//编译时装配
CryptoStream* fs1 = new CryptoStream();
BufferreadStream* fs2 = new BufferreadStream();
}
改进后:
//业务操作
//业务操作
class Stream {
public:
virtual char Read(int number) = 0;
virtual void Seek(int position) = 0;
virtual void Write(char data) = 0;
virtual ~Stream();
};
//主体类
class FileStream : public Stream {
public:
virtual char Read(int number) {
//读文件流
}
virtual void Seek(int position) {
//定位文件流
}
virtual void Write(char data) {
//写文件流
}
};
//扩展操作
class Decorator: public Stream{
protected:
Stream* stream;
Decorator(Stream* stm) :stream(stm) {}
};
class CryptoStream:public Decorator {
public:
CryptoStream(Stream* stm) :Decorator(stm) {
}
virtual char Read(int number) {
//额外加密操作
stream->Read(number);//读文件流
}
virtual void Seek(int position) {
//额外加密操作
stream->Seek(position);//定位文件流
}
virtual void Write(char data) {
//额外加密操作
stream->Write(data);//写文件流
}
};
class BufferreadStream :public Decorator {
Stream* stream; // ...
//...
public:
BufferreadStream(Stream* stm) :Decorator(stm) {
}
virtual char Read(int number) {
//额外加密操作
stream->Read(number);//读文件流
}
virtual void Seek(int position) {
//额外加密操作
stream->Seek(position);//定位文件流
}
virtual void Write(char data) {
//额外加密操作
stream->Write(data);//写文件流
}
};
void Progress() {
//运行时装配
FileStream* s1 = new FileStream();
CryptoStream* s2 = new CryptoStream(s1);
BufferreadStream* s3 = new BufferreadStream(s1);
}
定义:
体系结构:
Bridge
冗余设计:
#include <string>
class Messager {
public:
virtual void Login(std::string username, std::string password) = 0;
virtual void SendMessage(std::string message) = 0;
virtual void SendPicture(Image image) = 0;
virtual void PlaySound() = 0;
virtual void DrawShape() = 0;
virtual void WriteText() = 0;
virtual void Connect() = 0;
virtual ~Messager();
};
//平台实现
class PCMessagerBase :public Messager {
public:
virtual void PlaySound() {
//***
}
virtual void DrawShape() {
//***
}
virtual void WriteText() {
//***
}
virtual void Connect() {
//***
}
};
class MobileMessagerBase :public Messager {
public:
virtual void PlaySound() {
//***
}
virtual void DrawShape() {
//***
}
virtual void WriteText() {
//***
}
virtual void Connect() {
//***
}
};
//业务抽象
class PCMessagerLite :public PCMessagerBase {
public:
virtual void Login(std::string username, std::string password) {
PCMessagerBase::Connect();
//....
}
virtual void SendMessage(std::string message) {
PCMessagerBase::WriteText();
//....
}
virtual void SendPicture(Image image) {
PCMessagerBase::DrawShape();
//...
}
};
class PCMessagerPerfect :public PCMessagerBase {
public:
virtual void Login(std::string username, std::string password) {
PCMessagerBase::PlaySound();
//***
PCMessagerBase::Connect();
//....
}
virtual void SendMessage(std::string message) {
PCMessagerBase::PlaySound();
//***
PCMessagerBase::WriteText();
//....
}
virtual void SendPicture(Image image) {
PCMessagerBase::PlaySound();
//***
PCMessagerBase::DrawShape();
//...
}
};
class MobileMessagerLite :public MobileMessagerBase {
public:
virtual void Login(std::string username, std::string password) {
MobileMessagerBase::Connect();
//....
}
virtual void SendMessage(std::string message) {
MobileMessagerBase::WriteText();
//....
}
virtual void SendPicture(Image image) {
MobileMessagerBase::DrawShape();
//...
}
};
class MoblieMessagerPerfect :public MobileMessagerBase {
public:
virtual void Login(std::string username, std::string password) {
MobileMessagerBase::PlaySound();
//***
MobileMessagerBase::Connect();
//....
}
virtual void SendMessage(std::string message) {
MobileMessagerBase::PlaySound();
//***
MobileMessagerBase::WriteText();
//....
}
virtual void SendPicture(Image image) {
MobileMessagerBase::PlaySound();
//***
MobileMessagerBase::DrawShape();
//...
}
};
优化设计:
#include <string>
class Messager {
protected:
MessagerImp* messager;
public:
Messager(MessagerImp* m) :messager(m) {}
virtual void Login(std::string username, std::string password) = 0;
virtual void SendMessage(std::string message) = 0;
virtual void SendPicture(Image image) = 0;
virtual ~Messager();
};
class MessagerImp {
public:
virtual void PlaySound() = 0;
virtual void DrawShape() = 0;
virtual void WriteText() = 0;
virtual void Connect() = 0;
virtual ~MessagerImp();
};
//平台实现
class PCMessagerImp :public MessagerImp {
public:
virtual void PlaySound() {
//***
}
virtual void DrawShape() {
//***
}
virtual void WriteText() {
//***
}
virtual void Connect() {
//***
}
};
class MobileMessagerImp :public MessagerImp {
public:
virtual void PlaySound() {
//***
}
virtual void DrawShape() {
//***
}
virtual void WriteText() {
//***
}
virtual void Connect() {
//***
}
};
//业务抽象
class MessagerLite :public Messager {
public:
MessagerLite(MessagerImp* m) :Messager(m) {}
virtual void Login(std::string username, std::string password) {
messager->Connect();
//....
}
virtual void SendMessage(std::string message) {
messager->WriteText();
//....
}
virtual void SendPicture(Image image) {
messager->DrawShape();
//...
}
};
class MessagerPerfect :public Messager {
public:
MessagerPerfect(MessagerImp* m) :Messager(m) {}
virtual void Login(std::string username, std::string password) {
messager->PlaySound();
//***
messager->Connect();
//....
}
virtual void SendMessage(std::string message) {
messager->PlaySound();
//***
messager->WriteText();
//....
}
virtual void SendPicture(Image image) {
messager->PlaySound();
//***
messager->DrawShape();
//...
}
};
void Process(){
MessagerImp* imp = new PCMessagerImp();
Messager* m = new MessagerPerfect(imp);
}
体系结构:
工厂方法模式
"对象创建"模式
Factory Method
细节依赖导致的紧耦合:
#include <string>
#include <iostream>
#include <vector>
#include <list>
class MainForm : public Form, public IProgress {
TextBox* txtFilePath;
TextBox* txtFileNumber;
ProgressBar* progressBar; //通知控件
public:
void Button1_Click() {
std::string filePath = txtFilePath->getText();
int number = atoi(txtFileNumber->getText().c_str());
ISplitter splitter =
new BinarySplitter(filePath, number);//依赖具体类
splitter.split();
}
virtual void DoProgress(float value) {
progressBar->setValue(value);
}
};
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter() {}
};
class BinarySplitter:public ISplitter {
};
class TxtSplitter:public ISplitter {
};
class PictureSplitter :public ISplitter {
};
class VideoSplitter :public ISplitter {
};
工厂设计模式:
#include <string>
class MainForm : public Form{
SplitterFactory* factory;
public:
MainForm(SplitterFactory* factory) {
this->factory = factory;
}
void Button1_Click() {
ISplitter* splitter = factory->CreateSplitter(); //多态new
splitter->split();
}
};
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter() {}
};
class SplitterFactory {
public:
virtual ISplitter* CreateSplitter() = 0;
~SplitterFactory();
};
class BinarySplitter:public ISplitter {
virtual void split() {
}
};
class TxtSplitter:public ISplitter {
virtual void split() {
}
};
class PictureSplitter :public ISplitter {
virtual void split() {
}
};
class VideoSplitter :public ISplitter {
virtual void split() {
}
};
//具体工厂
class BinarySplitterFactory :public SplitterFactory {
public:
virtual ISplitter* CreateSplitter() {
return new BinarySplitter();
}
};
class TxtSplitterFactory :public SplitterFactory {
public:
virtual ISplitter* CreateSplitter() {
return new TxtSplitter();
}
};
class PictureSplitterFactory :public SplitterFactory {
public:
virtual ISplitter* CreateSplitter() {
return new PictureSplitter();
}
};
class VideoSplitterFactory :public SplitterFactory {
public:
virtual ISplitter* CreateSplitter() {
return new VideoSplitter();
}
};
抽象工厂
#include<vector>
//数据库访问有关的基类
class IDBConnection {
};
class IDBCommand {
};
class IDataReader {
};
class IDBFactory {
public:
virtual IDBConnection* CreateDBConnection() = 0;
virtual IDBCommand* CreateDBCommand() = 0;
virtual IDataReader* CreateDataReader() = 0;
};
//支持SqlServer
class SqlConnection : public IDBConnection {
};
class SqlCommand :public IDBCommand {
};
class SqlDataReader :public IDataReader {
};
class SqlDBFactory :public IDBnFactory {
virtual IDBConnection* CreateDBConnection() {
return new SqlConnection();
}
virtual IDBCommand* CreateDBCommand() {
return new SqlCommand();
}
virtual IDataReader* CreateDataReader() {
return new SqlDataReader();
}
};
//支持Oracle
class OracleConnection : public IDBConnection {
};
class OracleCommand :public IDBCommand {
};
class OracleDataReader :public IDataReader {
};
class OracleDBFactory :public IDBnFactory {
virtual IDBConnection* CreateDBConnection() {
return new SqlConnection();
}
virtual IDBCommand* CreateDBCommand() {
return new SqlCommand();
}
virtual IDataReader* CreateDataReader() {
return new SqlDataReader();
}
};
class EmployeeDAO {
IDBFactory* dbfactory;
public:
std::vector<EmployeeDAO> GetEmployees() {
IDBConnection* connection =
dbfactory->CreateDBConnection();
IDBCommand* command =
dbfactory->CreateDBCommand();
command->SetConnection(connection); //关联性
IDataReader* reader =
dbfactory->CreateDataReader();
while (reader->Read()) {
}
}
};
原型模式
//抽象类
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter() {}
virtual ISplitter* clone() = 0; //通过克隆自己去创建对象
};
class BinarySplitter :public ISplitter {
virtual void split() {}
virtual ISplitter* clone() {
return new BinarySplitter(*this);
}
};
class TxtSplitter :public ISplitter {
virtual void split() {}
virtual ISplitter* clone() {
return new TxtSplitter(*this);
}
};
class PictureSplitter :public ISplitter {
virtual void split() {}
virtual ISplitter* clone() {
return new PictureSplitter(*this);
}
};
class VideoSplitter :public ISplitter {
virtual void split() {}
virtual ISplitter* clone() {
return new VideoSplitter(*this);
}
};
class MainForm : public Form {
ISplitter* factory;
public:
MainForm(ISplitter* factory) {
this->factory = factory; //原型对象
}
void Button1_Click() {
ISplitter* splitter = factory->clone(); //
splitter->split();
}
};
构建器
class House {
//...
};
class HouseBuilder {
public:
House* GetRes() {
return pHouse;
}
virtual ~HouseBuilder();
protected:
House* pHouse;
virtual void BuildPart1() = 0;
virtual void BuildPart2() = 0;
virtual bool BuildPart3() = 0;
virtual void BuildPart4() = 0;
virtual void BuildPart5() = 0;
};
class HouseDirector {
public:
HouseBuilder* pHouseBuilder;
HouseDirector(HouseBuilder* p) {
this->pHouseBuilder = p;
}
House* Construct() {
//C++构造函数是静态绑定
pHouseBuilder->BuildPart1();
for (int i = 0; i < 4; ++i) {
pHouseBuilder->BuildPart2();
}
bool flag = pHouseBuilder->BuildPart3();
if (flag) {
pHouseBuilder->BuildPart4();
}
pHouseBuilder->BuildPart5();
return pHouseBuilder->GetRes();
}
};
class StoneHouse :public House {
};
class StoneHouseBuilder :public HouseBuilder {
protected:
virtual void BuildPart1() {
}
virtual void BuildPart2() {
}
virtual bool BuildPart3() {
}
virtual void BuildPart4() {
}
virtual void BuildPart5() {
}
};
int main() {
House* pHouse = new StoneHouse();
}
对象性能模式
Singleton
主要解决性能上的问题,不是上面工厂上的紧耦合问题!
简单写法:但是存在一个问题,单线程下安全,多线程下会存在安全问题
class Singleton {
private:
Singleton();
Singleton(const Singleton& other);
public:
static Singleton* getInstance();
static Singleton* m_instance;
};
Singleton* Singleton::m_instance = nullptr;
//线程非安全版本
Singleton* Singleton::getInstance() {
if (m_instance == nullptr) {
m_instance = new Singleton();
}
return m_instance;
}
解决办法:
#include <atomic>
#include <mutex>
class Singleton {
private:
Singleton();
Singleton(const Singleton& other);
public:
static Singleton* getInstance();
static Singleton* m_instance;
static std::mutex m_mutex;
};
Singleton* Singleton::m_instance = nullptr;
//线程非安全版本(多线程下不安全)
Singleton* Singleton::getInstance() {
if (m_instance == nullptr) {
m_instance = new Singleton();
}
return m_instance;
}
//线程安全版本,加锁,但是代价比较高
Singleton* Singleton::getInstance() {
Lock lock;
if (m_instance == nullptr) {
m_instance = new Singleton();
}
return m_instance;
}
//双检查锁,但由于内存读写reorder不安全
//锁前锁后都检查一次
//锁前检查代价高 跟上面一样
//锁后不检查 有时候会发生错误,创建不止1个对象
Singleton* Singleton::getInstance() {
if (m_instance == nullptr) {
Lock lock;
if (m_instance == nullptr) {
m_instance = new Singleton();
}
}
return m_instance;
}
//C++11版本之后跨平台实现(volatile)
std::atomic<Singleton*> Singleton::m_instance;
std::mutex Singleton::m_mutex;
Singleton* Singleton::getInstance() {
Singleton* tmp = m_instance.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire); //获取内存fence
if (tmp == nullptr) {
std::lock_guard<std::mutex> lock(m_mutex);
tmp = m_instance.load(std::memory_order_relaxed);
if (tmp == nullptr) {
tmp = new Singleton;
std::atomic_thread_fence(std::memory_order_release); //释放内存fence
m_instance.store(tmp, std::memory_order_relaxed);
}
}
return tmp;
}
定义:
结构:
要点总结:
Flyweight
模式定义:
#include <string>
#include <map>
class Font {
private:
//unique object key
std::string key;
//object state
//...
public:
Font(const std::string& key) {
//...
}
};
class FontFactory {
private:
std::map<std::string, Font*> fontPool;
public:
Font* GetFont(const std::string& key) {
std::map<std::string, Font*>::iterator item = fontPool.find(key);
if (item != fontPool.end()) {
return fontPool[key];
}
else {
Font* font = new Font(key);
fontPool[key] = font;
return font;
}
}
void clear() {
//....
}
};
结构:
总结:
接口隔离模式
facade
模式定义:
结构:
在子系统和外系统中的一种解耦方式,用一个稳定的接口去隔离变化的部分。
Proxy代理模式
定义:
结构:
原始代码:存在问题,可能是性能、控制、分布式等
class ISubject {
public:
virtual void process();
};
class RealSubject :public ISubject {
public:
virtual void process() {
//...
}
};
class ClientApp {
ISubject* subject;
public:
ClientApp() {
subject = new RealSubject();
}
void DoTask() {
//...
subject->process();
//...
}
};
Proxy:
class ISubject {
public:
virtual void process();
};
//Proxy的设计 作为realSubject的代理
class SubjectProxy :public ISubject {
public:
virtual void process() {
//...对RealSubject得一种间接访问
//...
}
};
class ClientApp {
ISubject* subject;
public:
ClientApp() {
subject = new SubjectProxy();
}
void DoTask() {
//...
subject->process();
//...
}
};
总结:
Adapter
模式定义:
结构:
#include <deque>
//目标接口(新街口)
class ITarget {
public:
virtual void process() = 0;
};
//遗留接口(老接口)
class IAdaptee {
public:
virtual void foo(int data) = 0;
virtual int bar() = 0;
};
//遗留类型
class OldClass:public IAdaptee{
//....
};
//遵循ITarget的接口规范
class Adatpter :public ITarget {
protected:
IAdaptee* pAdaptee;
public:
Adatpter(IAdaptee* p) :pAdaptee(p) {}
virtual void process() {
int data = pAdaptee->bar();
pAdaptee->foo(data);
}
};
int main() {
IAdaptee* pAdaptee = new OldClass();
ITarget* pTarget = new Adatpter(pAdaptee);
pTarget->process();
}
//C++源码中栈和队列的实现
template<class type>
class stack {
std::deque<type> container;
//...各种接口
};
template<class type>
class queue {
std::deque<type> container;
//...各种接口
};
中介者
模式定义:
结构:
引入中介者,改变对象之间的复杂的引用关系。
状态变化模式
.
State
模式定义:
原始代码:有太多的if,else语句,如果网络状态发生增删,需要大幅度改动原本代码
enum NetworkState {
Network_Open,
Network_Close,
Network_Connect
};
class NetworkProcessor {
NetworkState state;
public:
void Opetation1() {
if (state == Network_Open) {
//........
state = Network_Close;
}
else if (state == Network_Close) {
//....
state = Network_Connect;
}
else if (state == Network_Connect) {
//....
state = Network_Open;
}
else if(...)
}
void Opetation1() {
if (state == Network_Open) {
//........
state = Network_Connect;
}
else if (state == Network_Close) {
//....
state = Network_Open;
}
else if (state == Network_Connect) {
//....
state = Network_Close;
}
else if(...)
}
};
更改后:再增加的时候,只需要增加类状态就行,不需要改变Processor的状态,即处于稳定状态,通过扩展子类可以实现。
enum NetworkState {
Network_Open,
Network_Close,
Network_Connect
};
class NetworkProcessor {
NetworkState state;
public:
void Opetation1() {
if (state == Network_Open) {
//........
state = Network_Close;
}
else if (state == Network_Close) {
//....
state = Network_Connect;
}
else if (state == Network_Connect) {
//....
state = Network_Open;
}
}
void Opetation1() {
if (state == Network_Open) {
//........
state = Network_Connect;
}
else if (state == Network_Close) {
//....
state = Network_Open;
}
else if (state == Network_Connect) {
//....
state = Network_Close;
}
}
};
class NetWorkState {
public:
NetWorkState* pNext;
virtual void Operation1() = 0;
virtual void Operation2() = 0;
virtual void Operation3() = 0;
virtual ~NetWorkState();
};
class OpenState :public NetWorkState {
static NetWorkState* m_instance;
public:
static NetWorkState* getInstance() {
if (m_instance == nullptr) {
m_instance = new OpenState();
}
return m_instance;
}
virtual void Operation1() {
//....
pNext = CloseState::getInstance();
};
virtual void Operation2() {
//...
pNext = ConnectState::getInstance();
};
virtual void Operation3() {
//.....
pNext = OpenState::getInstance();
};
};
class CloseState :public NetWorkState {
static NetWorkState* m_instance;
public:
static NetWorkState* getInstance() {
if (m_instance == nullptr) {
m_instance = new OpenState();
}
return m_instance;
}
virtual void Operation1() {
//....
};
virtual void Operation2() {
};
virtual void Operation3() {
};
};
class ConnectState :public NetWorkState {
static NetWorkState* m_instance;
public:
static NetWorkState* getInstance() {
if (m_instance == nullptr) {
m_instance = new OpenState();
}
return m_instance;
}
virtual void Operation1() {
//....
pNext = CloseState::
};
virtual void Operation2() {
};
virtual void Operation3() {
};
};
class NetWorkProcessor {
NetWorkState* pSate;
public:
NetWorkProcessor(NetWorkState* pState) {
this->pSate = pSate;
}
void operation1() {
//...
pSate->Operation1();
pSate = pSate->pNext;
//...
}
void operation2() {
//...
pSate->Operation2();
pSate = pSate->pNext;
//...
}
void operation3() {
//...
pSate->Operation3();
pSate = pSate->pNext;
//...
}
};
结构:
备忘录 Memento
模式定义:
#include <string>
class Memento {
std::string state;
//...
public:
Memento(const std::string& s) :state(s) {}
std::string getState() const { return state; }
void setState(const std::string& s) { state = s; }
};
class Originator {
std::string state;
//....
public:
Originator() {}
Memento createMemento() {
Memento m(state); //实际实现可能相当复杂
return m;
}
void setMemento(const Memento& m) {
state = m.getState();
}
};
int main() {
Originator originator;
//捕获对象状态, 存储到备忘录
Memento mem = originator.createMemento();
//...改变originator 的状态
//从备忘录中恢复
originator.setMemento(mem);
}
结构:
数据结构模式
Composite
模式定义:
Composite处理
树形结构,多态调用
#include <string>
#include <list>
#include <iostream>
class Component {
public:
virtual void process() = 0;
virtual ~Component() {};
};
class Composite : public Component {
std::string name;
std::list<Component*> elements;
public:
Composite(const std::string& s) :name(s) {}
void add(Component* element) {
elements.push_back(element);
}
void remove(Component* element) {
elements.remove(element);
}
void process() {
//1.process current node
std::cout << name << std::endl;
//2.process leaf nodes
for (auto& e : elements) {
e->process(); //多态调用
}
}
};
//叶子节点
class Leaf : public Component {
std::string name;
public:
Leaf(std::string s) :name(s) { }
void process() {
std::cout << "Leaf:" << name << std::endl;
//process current node
}
};
void Invoke(Component& c) {
//...
c.process();
//...
}
int main() {
Composite root("root");
Composite treeNode1("treeNode1");
Composite treeNode2("treeNode2");
Composite treeNode3("treeNode3");
Composite treeNode4("treeNode4");
Leaf leaf1("leaf1");
Leaf leaf2("leaf2");
root.add(&treeNode1);
treeNode1.add(&treeNode2);
treeNode2.add(&leaf1);
root.add(&treeNode3);
treeNode3.add(&treeNode4);
treeNode4.add(&leaf2);
Invoke(root);
}
运行结果:
结构示意图:
Iterator 迭代器
定义:
迭代器实现:
#include <iostream>
template<typename T>
class Iterator
{
public:
~Iterator() {};
virtual void first();
virtual void next();
virtual bool isDone() const;
virtual T& current();
};
template<typename T>
class MyCollection {
public:
Iterator<T> GetIterator() {
//...
}
};
template<typename T>
class CollectionIterator : public Iterator<T> {
MyCollection<T> mc;
public:
CollectionIterator(const MyCollection<T>& c) : mc(c) {}
void first() override {
}
void next() override {
}
bool isDone() const override {
}
T& current() override {
}
};
void MyAlgorithm() {
MyCollection<int> mc;
Iterator<int> iter = mc.GetIterator();
for (iter.first(); !iter.isDone(); iter.next()) {
//处理
std::cout << iter.current() << std::endl;
}
}
结构:
职责链
模式定义:
代码实现:
#include <iostream>
#include <string>
using namespace std;
enum class RequestType
{
REQ_HANDLER1,
REQ_HANDLER2,
REQ_HANDLER3
};
//请求
class Request {
std::string description;
RequestType reqType;
public:
Request(const std::string& desc, RequestType type) :description(desc), reqType(type) {}
RequestType getType() const{ return reqType; }
const std::string& getDescription() const { return description; }
};
//处理者 形成多态链表
class ChainHandler {
ChainHandler* nextChain;
void sendRequestToNextHandler(const Request& req) {
if (nextChain != nullptr) {
nextChain->handle(req);
}
}
protected:
virtual bool canHandleRequest(const Request& req) = 0;
virtual void processRequest(const Request& req) = 0;
public:
ChainHandler() { nextChain = nullptr; }
void setNextChain(ChainHandler* next) { nextChain = next; }
void handle(const Request& req) {
if (canHandleRequest(req)) {
processRequest(req);
}
else {
sendRequestToNextHandler(req);
}
}
};
class Handler1 :public ChainHandler {
protected:
bool canHandleRequest(const Request& req) override {
return req.getType() == RequestType::REQ_HANDLER1;
}
void processRequest(const Request& req) override {
std::cout << "Handler1 is handling the request: " << req.getDescription() << std::endl;
}
};
class Handler2 :public ChainHandler {
protected:
bool canHandleRequest(const Request& req) override {
return req.getType() == RequestType::REQ_HANDLER2;
}
void processRequest(const Request& req) override {
std::cout << "Handler2 is handling the request: " << req.getDescription() << std::endl;
}
};
class Handler3 :public ChainHandler {
protected:
bool canHandleRequest(const Request& req) override {
return req.getType() == RequestType::REQ_HANDLER3;
}
void processRequest(const Request& req) override {
std::cout << "Handler3 is handling the request: " << req.getDescription() << std::endl;
}
};
int main() {
Handler1 h1;
Handler2 h2;
Handler3 h3;
h1.setNextChain(&h2);
h2.setNextChain(&h3);
Request req("process task ...", RequestType::REQ_HANDLER3);
h1.handle(req);
}
行为变化模式
命令模式
模式定义:
代码示例:
#include <string>
#include <iostream>
#include <vector>
using namespace std;
class Command {
public:
virtual void execute() = 0;
};
class ConcreteCommand1 :public Command {
string arg;
public:
ConcreteCommand1(const string& a) : arg(a) {}
void execute() override {
cout << "#1 process..." << arg << endl;
}
};
class ConcreteCommand2 :public Command {
string arg;
public:
ConcreteCommand2(const string& a) : arg(a) {}
void execute() override {
cout << "#2 process..." << arg << endl;
}
};
class MacroCommand :public Command {
vector<Command*> commands;
public:
void addCommand(Command* c) { commands.push_back(c); }
void execute() override {
for (auto& c : commands) {
c->execute();
}
}
};
int main() {
ConcreteCommand1 command1("Arg ###");
ConcreteCommand2 command2("Arg ...");
MacroCommand macro;
macro.addCommand(&command1);
macro.addCommand(&command2);
macro.execute();
}
结构:
总结:把行为封装成对象
原始代码:
class Vistor;
class Element {
public:
virtual void Fun1() = 0;
virtual ~Element() {}
};
class ElementA : public Element {
public:
void Fun1() override {
//...
}
};
class ElementB : public Element {
public:
void Fun1() override {
//...
}
};
需求增加:增加一个函数func2(int)
class Vistor;
class Element {
public:
virtual void Fun1() = 0;
virtual void Fun2(int data) = 0;
virtual ~Element() {}
};
class ElementA : public Element {
public:
void Fun1() override {
//...
}
void Fun2(int data) override {
//..
}
};
class ElementB : public Element {
public:
void Fun1() override {
//...
}
void Fun2(int data) override {
//..
}
};
解析器
模式定义:
#include <iostream>
#include <string>
#include <map>
#include <stack>
using namespace std;
class Expression {
public:
virtual int interpreter(map<char, int> var) = 0;
virtual ~Expression() {};
};
//变量表达式
class VarExpression :public Expression {
char key;
public:
VarExpression(const char& key) {
this->key = key;
}
int interpreter(map<char, int> var) override {
return var[key];
}
~VarExpression() {}
};
//符号表达式
class SymbolExpression : public Expression {
//运算符左右两个参数
protected:
Expression* left;
Expression* right;
public:
SymbolExpression(Expression* left, Expression* right):left(left), right(right) { }
~SymbolExpression() {
}
};
//加法运算
class AddExpression :public SymbolExpression {
public:
AddExpression(Expression* left, Expression* right) :
SymbolExpression(left, right) {}
int interpreter(map<char, int> var) override {
return left->interpreter(var) + right->interpreter(var);
}
~AddExpression() {}
};
//减法运算
class SubExpression :public SymbolExpression {
public:
SubExpression(Expression* left, Expression* right) :
SymbolExpression(left, right) {}
int interpreter(map<char, int> var) override {
return left->interpreter(var) - right->interpreter(var);
}
~SubExpression() {}
};
Expression* analyse(string expStr) {
stack<Expression*> expStack;
Expression* left = nullptr;
Expression* right = nullptr;
for(int i = 0; i < expStr.size(); ++i)
{
switch (expStr[i])
{
case '+':
left = expStack.top();
right = new VarExpression(expStr[++i]);
expStack.push(new AddExpression(left, right));
break;
case '-':
left = expStack.top();
right = new VarExpression(expStr[++i]);
expStack.push(new SubExpression(left, right));
break;
default:
expStack.push(new VarExpression(expStr[i]));
break;
}
}
Expression* expression = expStack.top();
return expression;
}
void release(Expression* expression) {
//释放表达式树节点内存
}
int main() {
string expStr = "a+b-c+d";
map<char, int> var;
var.insert(make_pair('a', 5));
var.insert(make_pair('b', 2));
var.insert(make_pair('c', 1));
var.insert(make_pair('d', 6));
Expression* exp = analyse(expStr);
int res = exp->interpreter(var);
std::cout << res << std::endl;
}
结构:
总结:
总结
核心:管理变化,提高复用!
八个设计原则!