【问题标题】:C# Strategy pattern design problemC#策略模式设计问题
【发布时间】:2011-08-10 20:10:53
【问题描述】:

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

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

伪代码:

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

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

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

【问题讨论】:

  • 你的伪代码是什么意思?我也看不到这里的策略模式。
  • 您尝试过哪些方法?这似乎更像是一个哲学问题。
  • 这是一种使用外围枚举调用某些配置器然后执行其委托(指向同一对象内的成员方法的指针)的方法。抱歉,我这里有不止一个问题。
  • @BrokenGlass 您个人资料上的第二张图片已损坏。而且我不知道 106 在问什么问题。
  • @BrokenGlass,每个策略都取决于外围。代码缺少使用 Periphial.GPIO => ConfigureGPIO 方法分配字典的内容。

标签: c# oop design-patterns


【解决方案1】:

如果你的 Periphial(应该改为 Peripheral 吗?)确实有一个 Configure 方法呢?

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

或者如果您的外设返回了配置器?

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

【讨论】:

    【解决方案2】:

    如果您没有太多外设,请尝试使用泛型。 因此,为每个外设 TPeripherial1、TPeripheral2 等创建一个类型。 然后做一个通用接口

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-07
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 1970-01-01
        相关资源
        最近更新 更多