来源:
http://www.tnove.com/?p=59
之前学过软件设计模式,但没有在工程中用过,所以基本学过的都快忘光了。这几天看到模板模式,网上搜了下主要是介绍Java 的,
所以我也来记录下C++下面我对模板模式的理解
当你实现一个算法的时候,通常不希望将实现信息暴露给外部和给外部使用,包括将会被继承的类。
但是,算法有要有扩充性,可以针对不同的信息实现不同的结果。怎么办?私有的虚函数:
这个函数只有我可以使用,但是却能够迟后决定调用的具体函数。从而在封装上和扩展性能上都有比较好的性能
base 类中定义了一个私有的纯虚函数,一般来讲虚函数应该定义为共有或保护类型较多,这样子类才能调用。当定义为私有时,只能基类自己调用(主要供基类的公有成员函数调用)。
这样做是为了达到某种设计目的,不想子类碰该函数。
类如上面,不同的子类继承base后需要实现base的纯虚函数fun();而实现过程会不一样。
这样,子类可以通过调用基类的公有do()函数去调用自身实现的fun()函数,实际上这样是没有多大实际意义的。因为子类可以直接调用自己的fun()。
还有一种情况是,当公有继承base类时,外界可以通过调用base的do()函数,从而连环的调用对应的fun()函数,而do()函数据体会调用哪个子类定义的fun(),则更具实际
情况决定(多态)
这样的基类定义使用在如下情况:
在定义基类时,不能明确知道自己将要干什么,或继承自己的子类将要干什么
为子类留下灵活的接口方便其实现自己的方法。
将fun()定义成私有是为了其子类不能访问,达到一定封装目的。当然可以不用定义为私有(大多情况纯虚函数为公有,为外部提供调用),此处也可以为普通虚函数。
此处 base可以叫做模板类,而fun()可以称为模板方法,应为在base的基础上可以定义一系列子类实现不同的fun()功能。
另外此处纯虚函数 私有依然是多态的,类成员函数访问类型与其是否能override没有直接关系。
关于纯虚函数的几点:
1。纯虚函数是可以有缺省实现的(也可以没有),但是虚函数必须要有缺省实现,纯虚函数的实现要在类外部写,inline是不可以的。
2。私有的虚函数依然多态性
3。纯虚函数在派生类中不一定非要实现,只要不实例化就可以了。
上面就是一种模板模式的实现方法