cover.hpp main.cpp放在同一个文件夹下编译即可
使用策略模式写的一个汇率转换的例子
拓展非常方便
/*
cover.hpp
实现汇率转换的一个接口,由于要使用虚函数动态绑定,因此要写一个共同的基类
*/
class cover_base{
public:
virtual double chg(double)=0; //写一个interface,用户必须实现其中的转换接口
virtual ~cover_base(){}
};
class tool{
public:
cover_base* cb;
//指针用于虚函数动态绑定后续添加的类,其他汇率继承cover_base,重写其chg方法即可,这个cover文件就和算法无关了
tool(cover_base* ptr):cb(ptr){
//初始化所需要使用的汇率类
}
double chg(double money){
return cb->chg(money);
//ok,调用完毕,至于这个chg怎么实现,我们不关心,实现留给其他的派生类
//这个文件写好以后,就再也不懂修改了
//增加新的汇率算法,只需要继承 cover_base 基类,重写chg算法就可以
}
};
/*
1.策略模式:
将算法的实现和接口分开,将算法的实现放在专门的策略类中,每一个策略类实现一个算法。针对抽象策略编程
eg:
汇率转换软件
试以strategy模式来设计一个灵活的汇率转换软件
*/
#include<iostream>
#include"cover.hpp"
using namespace std;
//我们再也不用去修改cover.hpp,只需要继承cover_base并且重写chg方法就可以
class UStoCN : public cover_base{ //实现了美元的汇率算法
public:
virtual double chg(double money){
return 7.01*money; //返回美元-》人民币
}
};
class FRtoCN : public cover_base{ //实现了英镑的汇率算法
public:
virtual double chg(double money){
return money*8.99; //返回英镑=》人民币
}
};
int main(){
//我们现在若是想拓展算法,只用继承-》覆写-》调用,根本不用去改动cover.hpp
//这就是strategy设计模式的好处
UStoCN m1;
FRtoCN m2;
tool t(&m1); //动态的指针指向m1对象,调用UStoCN的汇率转换算法
cout<<t.chg(10)<<"---美元转人民币"<<endl;
t.cb=&m2; //动态的指针指向FRtoCN对象,以便调用虚函数
cout<<t.chg(10)<<"---英镑转人民币"<<endl;
return 0;
}