【发布时间】:2011-08-18 22:21:36
【问题描述】:
我正在尝试将策略模式应用于特定情况,但在如何避免将每个具体策略耦合到为其提供数据的上下文对象时遇到了问题。下面是一个模式的简化案例,它以几种不同的方式出现,但应该以类似的方式处理。
我们有一个对象Acquisition,它提供与特定时间框架相关的数据——基本上是使用不同硬件收集的一堆外部数据。由于它包含的数据量,它已经太大了,所以我不想给它任何进一步的责任。我们现在需要获取其中的一些数据,并根据一些配置向硬件发送相应的电压。
所以,想象一下以下(非常简化的)类:
class Acquisition
{
public Int32 IntegrationTime { get; set; }
public Double Battery { get; set; }
public Double Signal { get; set; }
}
interface IAnalogOutputter
{
double getVoltage(Acquisition acq);
}
class BatteryAnalogOutputter : IAnalogOutputter
{
double getVoltage(Acquisition acq)
{
return acq.Battery;
}
}
现在,每个具体的策略类都必须与我的 Acquisition 类耦合,这也是最有可能修改的类之一,因为它是我们应用程序的核心。这仍然是对旧设计的改进,旧设计是Acquisition 类内部 中的一个巨大的 switch 语句。每种类型的数据可能有不同的转换方式(Battery 是简单的 pass-through,其他的就没那么简单了),所以我觉得 Strategy 模式或者类似的应该是要走的路。
我还要注意,在最终实现中,IAnalogOutputter 将是一个抽象类而不是一个接口。这些类将位于用户可配置的列表中并序列化为 XML 文件。该列表必须在运行时可编辑并被记住,因此 Serializable 必须是我们最终解决方案的一部分。以防万一。
如何确保每个实现类都获得工作所需的数据,而不将其与我最重要的类之一联系起来?还是我以完全错误的方式处理这类问题?
【问题讨论】:
标签: c# oop design-patterns strategy-pattern decoupling