policies设计
这个设计目前对我而言,还有点深,先留个坑 假设某个对象有大量的功能需求,这时候大多数人选择的设计方案是:设计一个全功能型接口。这样做会导致接口过于庞大已经难以维护。 正确的做法是将功能正交分解,用多个类来维护这些接口,达到功能类高内聚,功能类间低耦合,然后使用多重继承来实现,并允许用户自己配置,这样的做法有一个很困难的地方,就是基类没有足够的信息知道派生类的类型。于是我们通过模版套娃,让派生类作为基类的模版参数。 &esp; 代码如下,笔者太菜,不敢自己写,不敢修改。
#include <iostream>
#include <tr1/memory>
using std::cin;
using std::cout;
using std::endl;
using std::tr1::shared_ptr;
template <class T>
class CreatorNew {
public:
CreatorNew() { cout << "Create CreatorNew Obj ! " << endl; }
~CreatorNew() { cout << "Destroy CreatorNew Obj ! " << endl; }
shared_ptr<T> CreateObj() {
cout << "Create with new operator !" << endl;
return shared_ptr<T>(new T());
}
};
template <class T>
class CreatorStatic {
public:
CreatorStatic() { cout << "Create CreatorStatic Obj ! " << endl; }
~CreatorStatic() { cout << "Destroy CreatorStatic Obj ! " << endl; }
T& CreateObj() {
cout << "Create with static obj !" << endl;
static T _t;
return _t;
}
};
template <template <class> class CreationPolicy>
class WidgetManager : public CreationPolicy<WidgetManager<CreationPolicy> > {
public:
WidgetManager() { cout << "Create WidgetManager Obj !" << endl; }
~WidgetManager() { cout << "Destroy WidgetManager Obj !" << endl; }
};
int main(int argc, char** argv) {
cout << "------------- Create WidgetManager Object ! ------------" << endl;
WidgetManager<CreatorNew> a_wid;
WidgetManager<CreatorStatic> b_wid;
cout << endl
<< "-- Create WidgetManager Object With CreateObj Method (New) ! --"
<< endl;
a_wid.CreateObj();
cout << endl
<< "-- Create WidgetManager Object With CreateObj Method (Static) ! --"
<< endl;
b_wid.CreateObj();
cout << endl
<< "------------ Destroy WidgetManager Object ! ------------" << endl;
return 0;
}
policies class 的析构函数
先说结论,不要使用public继承,上诉代码是错误的,第二policies类不要使用虚析构函数,并且为虚构函数设为protect。
policy 组合
当我们在设计一个智能指针的时候,我们能够想到有两个方向:是否支持多线程,是否进行指针检查,这两个功能是正交的,这就实现了policy的组装
定制指针
当我们设计智能指针的时候,我们不一定必须是传统指针,我们可以抽象指针为迭代器,缺省设置为一个既包含指针又包含引用的类。