当前:职责链
需求:坦克大战
创建两种坦克
坦克类型 | 射程 | 速度 |
b70 | 70米 | 时/70公里 |
b50 | 50米 | 时/70公里 |
类图:
代码(c++)
#include <iostream>
#include <string>
using namespace std;
class Function{
public:
string mFunction;
Function(string str){
mFunction = str;
}
void exe(){
cout<<mFunction<<"\n";
}
};
//抽象层
class AbstractShot{
public:
virtual void fun()=0;
};
class AbstractRun{
public:
virtual void fun()=0;
};
class Tank{
public:
AbstractShot* mPSort;
AbstractRun* mPRun;
virtual void fun(){
mPSort->fun();
mPRun->fun();
}
};
class Handler{
public:
Handler* mHandler;
virtual void create(Tank& t)=0;
};
class AbstractBuilder{
public:
AbstractBuilder(Handler& h):mHandler(h){}
Handler& mHandler;
virtual void create(Tank& tank){
mHandler.create(tank);
}
};
//实施层
class B70Shot: public AbstractShot{
public:
virtual void fun(){
Function function("B70Shot:射程70");
function.exe();
}
};
class B50Shot: public AbstractShot{
public:
virtual void fun(){
Function function("B50Shot:射程50");
function.exe();
}
};
class B70Run: public AbstractRun{
public:
virtual void fun(){
Function function("B70Run:速度70");
function.exe();
}
};
class B50Run: public AbstractRun{
public:
virtual void fun(){
Function function("B50Run:速度50");
function.exe();
}
};
class HandlerSortB70:public Handler{
public:
HandlerSortB70(Handler* h){
mHandler = h;
}
virtual void create(Tank& t){
t.mPSort = new B70Shot();
mHandler->create(t);
}
};
class HandlerRunB70:public Handler{
public:
virtual void create(Tank& t){
t.mPRun = new B70Run();
}
};
class HandlerSortB50:public Handler{
public:
virtual void create(Tank& t){
t.mPSort = new B50Shot();
mHandler->create(t);
}
};
class HandlerRunB50:public Handler{
public:
virtual void create(Tank& t){
t.mPRun = new B50Run();
}
};
class Direcctor{
public:
AbstractBuilder& mBuilder;
Direcctor(AbstractBuilder& b):mBuilder(b){
}
Tank& construct(){
Tank* tank = new Tank();
mBuilder.create(*tank);
return *tank;
}
};
// 客户端
class Client{
public:
static void main(){
HandlerRunB70 hr7;
HandlerSortB70 hs7(&hr7);
AbstractBuilder b(hs7);
Direcctor d(b);
Tank& t = d.construct();
t.fun();
}
};
//客户端调用
int main()
{
Function function("职责链模式演示");
function.exe();
Client::main();
//看代码不用考虑以下内容
int cin_a;
cin>>cin_a;
return 0;
}