C#策略模式设计问题

时间:2011-08-10 20:10:54

标签: c# oop design-patterns

我在尝试设计课程时遇到了麻烦。 我有抽象Chip类,STM8类,它扩展Chip并实现IConfigurable(具有Configure方法)。

我希望每个实现IConfigurable的类都有一个方法Configure,它使用一个参数来决定使用策略模式(方法)来配置什么。

Psuedo代码:

public void Configure(Periphial p)
{
  this.periphials[p]();
}

当然,配置的内容因每个课程而异。例如,STM8可以有GPIO和定时器,STM8L只能有GPIO。然后,创建每个子类的方式应该是愚蠢的,所以我想强迫人们在他们的类中声明自己的enum

最后,用一对enum / delegate初始化字典是否是一个好主意,以显示可以配置的内容?上面的伪代码中使用了this.periphials

3 个答案:

答案 0 :(得分:3)

如果您的Periphial(它应该被命名为Peripheral?)确实有一个Configure方法怎么办?

foreach (Peripheral p in peripherals) {
    p.Configure();
}

或者你的外围设备是否返回了配置程序?

foreach (Peripheral p in peripherals) {
    IConfigurator configurator = p.GetConfigurator();
    configurator.Configure();
}

答案 1 :(得分:0)

如果你没有太多的外围,尝试使用泛型。 因此,为每个外围TPeripherial1,TPeripherial2等制作一个类型。 然后创建一个通用接口

interface IConfigurable<T> : where T TPeripherialBase
{
     void Configure<T>()
}

然后在您支持的类上实现尽可能多的类型化可配置接口。 这些所有方法都可以路由到一个私有方法,这种方法不是类型和白痴安全的。

答案 2 :(得分:0)

我认为你不能用你对可能的外围设备的枚举做出你的建议。

我认为你应该做的是检查提供给Peripheral的{​​{1}}提供的类型,如果类型不是支持者,则返回自定义异常。

所以对于STM8L,你会这样做:

Configure()

如果您能够为public void Configure(Peripheral p) { if (p is GPIO) ConfigureGPIO() else throw new NotAvailablePeripheralException(p); } 的子类提供一些枚举,那么就像定义Chip(例如Porperties)一样。使用class inheritage会隐藏对象myChip.GPIO在编译时的内容......