我正在尝试将策略模式应用于特定情况,但是在如何避免将每个具体策略耦合到为其提供数据的上下文对象时遇到了问题。下面是一个模式的简化案例,它以几种不同的方式出现,但应该以类似的方式处理。
我们有一个对象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 类,这也是最有可能被修改的类之一,因为它是我们应用程序的核心。这仍然是对旧设计的改进,旧设计是类中的一个巨大的switch语句Acquisition
。每种类型的数据可能有不同的转换方法(虽然Battery是简单的传递,但其他的根本不是那么简单),所以我觉得策略模式或类似的应该是要走的路。
我还会注意到,在最终实现中,IAnalogOutputter
将是一个抽象类而不是一个接口。这些类将位于用户可配置的列表中并序列化为 XML 文件。该列表必须在运行时可编辑并被记住,因此 Serializable 必须是我们最终解决方案的一部分。万一它有所作为。
如何确保每个实现类都获得工作所需的数据,而不将其绑定到我最重要的类之一?还是我以完全错误的方式处理这类问题?