我目前遇到了一个设计问题。
假设有一个组件层次结构。这些组件中的每一个都派生自一个Component
看起来像这样的抽象类型:
public abstract class Component
{
public abstract Component Parent { get; }
public abstract ComponentCollection Children { get; }
}
现在我想为这些组件添加一些可选功能,让我们以能够在组件层次结构中搜索并在层次结构中选择组件为例。
像这样在基类中提供这些可选功能是否被认为是不好的做法:
public abstract class Component
{
// Other members
public abstract bool IsSearchable { get; }
public abstract bool Search(string searchTerm);
public abstract bool IsSelectable { get; }
public abstract bool Select();
}
而“搜索能力”和“选择能力”是通过例如使用策略模式在派生组件中管理的?
不知何故,这对我来说似乎违反了 SRP,但在我看来,唯一的选择是为每个可选功能提供一个接口,并且只在支持此功能的组件上实现它。
在我看来,这将有一个缺点,即每次我想检查组件是否提供特定功能时,我都必须编写这样的代码:
public bool Search(Component component, string searchTerm)
{
ISearchable searchable = component as ISearchable;
if(searchable != null)
{
searchable.Search(searchTerm);
}
}
您会选择哪种策略,或者您有什么更好的想法?
提前致谢!