目前,我有一个标准的策略模式实现,简化:
public interface IStrategy
{
IList<Dog> GetDogs();
}
public class DogStrategy: IStrategy
{
public IList<Dog> GetDogs()
{
return new List<Dog>();
}
}
我还有一个使用策略的类:
public class DogCollection
{
private IStrategy strategy;
public IStrategy Strategy
{
get { return strategy; }
set
{
if (strategy == null || value.GetType() != strategy.GetType())
{
strategy = value;
//do stuff
}
}
}
问题:我发现在 2 个地方实现了该模式是接口开始激增一点。这是可管理且灵活的,但我知道同事会因文件过多而感到不安——他们不喜欢设计模式。此外,我需要使用一些策略共有的逻辑,因此集合需要有一个从其继承的抽象类。
我在想而不是使用所有这些接口让 DogCollection 从包含额外逻辑的通用集合继承:
public class DogCollection : GenericCollection<Dog>
我可以使用 Loader 属性而不是 IStrategy 属性。然后我可以删除两种策略模式的各种文件:
public abstract class GenericCollection<T>
{
private Func<IList<T>> loader;
public Func<IList<T>> Loader
{
get { return loader; }
set
{
loader = value;
//do stuff
}
}
}
我不会通过在各种条件下启动具体的策略实现并在 DogCollection 中设置策略来设置策略,而是简单地创建一个包含例程的静态类来获取不同的 Dogs 并分配 Loader 属性。然后可以使用 loader 属性在请求时返回列表。
哪个是首选,为什么?