【问题标题】:Chain of Responsibility design pattern confusion责任链设计模式混乱
【发布时间】:2013-02-24 03:31:02
【问题描述】:

我理解责任链模式的概念,但可能我用错了。

我有几种类型的产品,并且我有一个控制器来控制为每种类型的产品显示的界面。用户选择产品类型,每个控制器负责显示相应的界面并与之交互。

为此,我使用了责任链模式,我认为这听起来不太好。我正在做的是创建一个控制器链,一旦我收到产品类型请求,我只需将其传递给控制器​​链并让适当的控制器实现请求。

但是在思考时,使用一个简单的工厂但有许多条件语句也可以实现相同的目标。

您如何看待在这种情况下使用责任链?

【问题讨论】:

  • 如果它有效,不要到处修复它。我可以想到命令模式来做同样的工作。
  • 但是责任链是否适用于此类问题?
  • 在我发布答案之前,我的问题是:一旦选择了产品类型,下游界面处理和导航是否取决于任何其他变量,或者它只是产品类型的函数而没有还有吗?
  • 仅产品类型的功能,例如要输入特定产品类型的详细信息,必须显示相应的视图,该视图由相应的控制器控制,并且需要将不同的参数传递给不同产品的构造函数,因此控制器显示相应的界面,得到值,将它们传递给正确的产品并返回产品

标签: java design-patterns factory chain-of-responsibility


【解决方案1】:

对我来说,这项任务绝对不是责任链。
通常在责任链中,链元素的顺序很重要,但在这里并非如此。

我会尝试执行以下操作。
创建某种注册表,其中包含一个映射,其中包含 productType 的键和控制器的值。

示例实现:

class ControllerRegistry
{
  //declaration for map and constructor

  public void Register(string productType, IProductController controller)
  {
    _map.Add(productType, controller);
  }

  public IProductController Find(string productType)
  {
    return _map[productType];
  }
}

在应用程序启动期间,您应该通过调用 ControllerRegistry.Register 方法注册所有控制器。
您可以通过调用ControllerRegistry.Find 方法获得合适的控制器。
与责任链相比,如果产品类型的数量很大,您将避免性能损失。

编辑
同一任务主题Design pattern for handling multiple message types

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多