簡體   English   中英

C# 策略模式設計問題

[英]C# Strategy pattern design problem

我在嘗試設計課程時遇到了麻煩。 我有抽象Chip class, STM8 class 擴展Chip並實現IConfigurable (具有配置方法)。

我希望每個實現IConfigurable的 class 都有一個方法Configure ,它需要一個 arguments 使用策略模式(方法)來決定配置什么。

偽代碼:

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

當然,每個 class 的配置都不同。 比如STM8可以有GPIO和Timers, STM8L只能有GPIO。 然后,每個子類的創建方式應該是愚蠢的,所以我想強迫人們在他們的類中聲明他們自己的enum

最后,用一對枚舉/委托來初始化字典以顯示可以配置的內容是一個好主意嗎? 上面的偽代碼中使用了this.periphials

如果您的 Periphial(應該改為 Peripheral 嗎?)確實有一個 Configure 方法怎么辦?

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

或者如果您的外圍設備返回了配置器?

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

如果您沒有太多外圍設備,請嘗試使用 generics。 因此,為每個外設 TPeripherial1、TPeripheral2 等創建一個類型。然后創建一個泛型接口

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

然后在 class 上實現盡可能多的類型化可配置接口,因為它支持。 所有這些方法都可以路由到一個私有方法,該方法不是類型和白痴安全的。

我不認為你可以對可能的外圍設備的枚舉做你建議的事情。

我認為你應該做的是檢查提供給Configure()Peripheral的類型,如果該類型不是支持者,則返回一個自定義異常。

所以對於STM8L,你會這樣做:

public void Configure(Peripheral p)
{

  if (p is GPIO) ConfigureGPIO()
  else throw new NotAvailablePeripheralException(p);

}

如果您能夠為Chip的子類提供一些可用的枚舉,則與您可以定義諸如myChip.GPIO之類的Porperties完全相同。 使用 class 繼承隱藏了 object 在編譯時的really含義......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM