假设我有大量的文件名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
or之类的任何操作之前不必进行真正的过滤get_list
。如果已经完成,我不想重做过滤。我只是在学习一些关于设计模式的东西,我想我可以使用:
AbstractFilter
实现filter*
方法的抽象基类- 工厂从被调用的方法中决定使用哪个装饰器
- 每次我调用
filter
* 方法时,我都会返回一个装饰类,例如:
AbstractFilter::filter_run(string arg) {
decorator = factory.get_decorator_run(arg); // if arg is "> 00179691" returns FilterRunGreater(00179691)
return decorator(this);
}
- 构建正则表达式以过滤文件名的代理,但不进行过滤
我也在学习 jQuery,我正在使用类似的链接机制。
有人可以给我一些提示吗?有什么地方可以解释这样的设计吗?设计必须非常灵活,特别是要处理文件名中的新格式。