c++的模板是个很强很暴力的东西,可以轻松地模拟多态。下面举个例子:
====================================================================
#include <iostream>
#include <string>
using namespace std;
class StarDecorator//注意:与多态不同,不需要有类阶层(简单说不需要继承啥接口)
{
public:
void
printHead()
{
cout
<< "**********"
<< endl;
}
void
printTail()
{
cout
<< "**********"
<< endl;
}
};
class AddDecorator
{
public:
void
printHead()
{
cout
<< "++++++++++"
<< endl;
}
void
printTail()
{
cout
<< "++++++++++"
<< endl;
}
};
template<class Decorator>
class Printer
{
public:
void
print(const string& str)
{
decorator.printHead();
cout
<< str
<< endl;
decorator.printTail();
}
private:
Decorator
decorator;
};
int main(int argc, char* argv[])
{
Printer<StarDecorator> p1;
p1.print("Hello,World!");
Printer<AddDecorator> p2;
p2.print("Hello,World!");
return
0;
}
========================================
是不是很像多态?更具体地说是设计模式中的Strategy模式。
这么做的好处:
1)比用多态时简单,不需要先构建Strategy对象再传入构造函数,故构造对象的代码简洁。
2)灵活机动,不需要类阶层,只要实现相关接口就可以召之即来。如果没有实现相关接口会有明显的编译错误提示。
这么做的缺点——和c++模板的缺点是一样的:
1)易读性比较不好,调试比较困难
2)模板只能定义在.h文件中,当工程大了之后,编译时间十分的变态。
结论:有些场合可以让代码较简洁,但应避免在比较底层的地方使用。