想我再也吨文件名的my_dir/my_subdir
,以某种方式格式化:设计定制的字符串过滤
data11_7TeV.00179691.physics_Egamma.merge.NTUP_PHOTON.f360_m796_p541_tid319627_00
data11_7TeV.00180400.physics_Egamma.merge.NTUP_PHOTON.f369_m812_p541_tid334757_00
data11_7TeV.00178109.physics_Egamma.merge.D2AOD_DIPHO.f351_m765_p539_p540_tid312017_00
例如data11_7TeV
是data_type
,00179691
试验号,NTUP_PHOTON
的数据格式。
我想写一个接口,做这样的事情:
dataset = DataManager("my_dir/my_subdir").filter_type("data11_7TeV").filter_run("> 00179691").filter_tag("m = 796");
// don't to the filtering, be lazy
cout << dataset.count(); // count is an action, do the filtering
vector<string> dataset_list = dataset.get_list(); // don't repeat the filtering
dataset.save_filter("file.txt", "ALIAS"); // save the filter (not the filenames), for example save the regex
dataset2 = DataManagerAlias("file.txt", "ALIAS"); // get the saved filter
cout << dataset2.filter_tag("p = 123").count();
我想偷懒的行为,例如没有真正的滤波具有像count
或get_list
任何行动之前完成。如果已经完成,我不想重做过滤。 我只是学习一些关于设计模式,我想我可以使用:
- 一个抽象基实现
filter*
方法 - 工厂从调用的方法来决定类
AbstractFilter
这装饰使用 - 我每次叫
filter
*方法我返回一个装饰类,例如时间:
AbstractFilter::filter_run(string arg) {
decorator = factory.get_decorator_run(arg); // if arg is "> 00179691" returns FilterRunGreater(00179691)
return decorator(this);
}
- 代理是建立一个正则表达式过滤的文件名,但不要做过滤
我也在学习jQuery和我使用的是类似链接机制。
有人可以给我一些提示吗?有没有什么地方可以解释这样的设计?设计必须非常灵活,特别是处理文件名中的新格式。
正则表达式不是问题。我会执行withoud第三部分库 – 2011-05-16 21:05:26