一、桥接模式与抽象类
通常在“既要约束子类的行为,又要为子类提供公共功能”的时候使用抽象类。
•
按照这个原则来思考模板方法模式的实现,模板方法模式需要固定定义算法的骨架,
这个骨架应该只有一份,算是一个公共的行为,但是里面具体的步骤的实现又可能是
各不相同的,恰好符合选择抽象类的原则。
•
变与不变
•
程序设计的一个很重要的思考点就是“变与不变”,也就是分析程序中哪些功能是可
变的,哪些功能是不变的,把不变的部分抽象出来,进行公共的实现,把变化的部分
分离出去,用接口来封装隔离,或用抽象类来约束子类行为。
•
模板方法模式很好的体现了这一点。模板类实现的就是不变的方法和算法的骨架,而
需要变化的地方,都通过抽象方法,把具体实现延迟到子类,还通过父类的定义来约
束了子类的行为,从而使系统能有更好的复用性和扩展性。
• 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以
不改变一个算法的结构即可重定义该算法的某些特定步骤
二、类图
三、代码实现
#include <iostream>
using namespace std;
//PC机,手机,平板
class MakeOrder {
public:
//virtual void startOrder() =0;第一版
//钩子函数的模板方法
virtual void startOrder() {
cout << "下订单了" << endl;
}
virtual void replyStart()=0;
//.....
virtual void finishOrder()=0;
virtual void replyFinish()=0;
//模板模式
void make() {
startOrder();
replyStart();
finishOrder();
replyFinish();
}
protected:
MakeOrder(){}
};
class Fanuc :public MakeOrder {
public:
void startOrder() {
cout << "Fanuc开始接受订单" << endl;
}
void replyStart() {
cout << "Fanuc做好预备,请将后继订单进入排队" << endl;
}
//.....
void finishOrder() {
cout << "本次Fanuc订单已经完成,请推进下个订单进入生产" << endl;
}
void replyFinish() {
cout << "Fanuc订单信号已经送达,即将推进下个订单进入生产" << endl;
}
};
class Sims :public MakeOrder {
public:
void startOrder() {
cout << "Sims开始接受订单" << endl;
}
void replyStart() {
cout << "Sims做好预备,请将后继订单进入排队" << endl;
}
//.....
void finishOrder() {
cout << "本次Sims订单已经完成,请推进下个订单进入生产" << endl;
}
void replyFinish() {
cout << "Sims订单信号已经送达,即将推进下个订单进入生产" << endl;
}
};
class Mits :public MakeOrder {
public:
void replyStart() {
cout << "Sims做好预备,请将后继订单进入排队" << endl;
}
//.....
void finishOrder() {
cout << "本次Sims订单已经完成,请推进下个订单进入生产" << endl;
}
void replyFinish() {
cout << "Sims订单信号已经送达,即将推进下个订单进入生产" << endl;
}
};
int main(void) {
//MakeOrder* pMakeOrder = new Fanuc;
//pMakeOrder->make();
MakeOrder* pMakeOrder = new Mits;
pMakeOrder->make();
system("pause");
return 0;
}