我们正在为小工具DTV编写通用中间件。我们有一个称为ContentMgr的模块,这是一个基类。现在,针对不同的客户需求,我们有VideoconContentMgr(例如),它来自ContentMgr。
class ContentMgr
{
public:
virtual void setContent()
{
cout<<"Unused function";
}
};
class VideoconContentMgr: public ContentMgr
{
virtual void setContent()
{
cout<<"Do some useful computation;
}
};
客户代码-根据产品类型-
/ **(如果产品是通用产品)** /
ContentMgr *产品=新的ContentMgr();
/ **如果产品是videocon ** /
ContentMgr *产品=新的VideoconContentMgr();
我的问题是根据接口(interface)隔离原理-应该避免油脂过多/污染的接口(interface)。我如何避免受污染的方法-setContent()。对于通用产品,setContent()无效。但是,对于videocon产品,它很有用。如何避免脂肪/污染方法setContent()?
最佳答案
一种解决方案是将成员函数保留在有用的位置-仅将其放入VideoconContentMgr
中,并在VideoconContentMgr
子类型特定的上下文中使用它:
/** if the product is generic **/ ContentMgr *product = new ContentMgr();
/** If the product is videocon **/ {
VideoconContentMgr *vcm = new VideoconContentMgr();
vcm->setContent();
ContentMgr *product = vcm;
}
如果特定于子类的成员函数的有用性超出了初始化时间,请使用类似于visitor的方法。特定于子类的代码仍然绑定(bind)到子类,但是现在您添加了对通用类不执行任何操作的访问者,并在
setContent()
类上调用VideoconContentMgr
:struct ContentMgrVisitor {
virtual void visitGeneric(ContentMgr& m) {};
virtual void visitVideo(VideoconContentMgr& vm) {};
};
struct ContentMgr
{
virtual void accept(ContentMgrVisitor& v)
{
v.visitGeneric(this);
}
};
struct VideoconContentMgr: public ContentMgr
{
virtual void setContent()
{
cout<<"Do some useful computation;
}
virtual void accept(ContentMgrVisitor& v)
{
v.visitVideo(this);
}
};
现在,想要调用
setContent
的客户可以从访问者处进行操作:class SetContentVisitor : public ContentMgrVisitor {
void visitVideo(VideoconContentMgr& vm) {
vm.setContent();
}
};
...
ContentMgr *mgr = ... // Comes from somewhere
SetContentVisitor scv;
mgr->accept(scv);