c#策略模式设计问题

本文关键字:问题 模式 策略 | 更新日期: 2023-09-27 18:05:03

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

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

推出

伪代码:

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

当然,每个类需要配置的东西是不同的。例如,STM8可以有GPIO和Timers, STM8L只能有GPIO。然后,每个子类的创建方式应该是愚蠢的,所以我想强迫人们在他们的类中声明他们自己的enum

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

c#策略模式设计问题

如果您的Periphial(应该将其命名为Peripheral吗?)确实有一个Configure方法呢?

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

或者如果你的外设返回一个配置器?

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

如果没有太多的外设,请尝试使用泛型。所以为每个外围设置一个类型TPeripherial1, TPeripherial2等等。然后创建一个通用接口

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

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

我认为你不能按照你的建议为可能的外设使用枚举。

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

对于STM8L,您可以这样做:

public void Configure(Peripheral p)
{
  if (p is GPIO) ConfigureGPIO()
  else throw new NotAvailablePeripheralException(p);
}

如果您能够为Chip的子类提供一些枚举,那么它将与您可以将Porperties定义为myChip.GPIO完全相同。使用类继承隐藏了对象really在编译时是什么…