【问题标题】:Decision making design pattern help决策设计模式帮助
【发布时间】:2016-04-06 18:32:03
【问题描述】:

我有一种情况(伪代码):

Action a;
Object o;
if(objectIsPartOfGroup(o, "Group1"))
  a = treatCaseGroup1();
if(a != indecisive)
  return a;

if(objectIsPartOfGroup(o, "Group2"))
  a = treatCaseGroup2();
if(a != indecisive)
  return a;

if(objectIsPartOfGroup(o, "Group3"))
  a = treatCaseGroup3();
if(a != indecisive)
  return a;
.
.
.

我想知道是否有适用于这种情况的模式,这样我就不必重复“if(a != indecisive) return a;”每一步后检查?我发现一遍又一遍地重复这段代码不是很……专业?它添加了很多代码行,根本无法帮助清晰,因此我觉得它很烂。

编辑:一个对象可以是 group1 和 group2 和 group3 的一部分,等等......所以说一个对象是 group1 的一部分并且动作是不确定的,因为它也是 group2 的一部分,它将被一次又一次地对待, 直到所有组都被处理。最后,结果也可能是不确定的!

感谢您的帮助!

戴夫

【问题讨论】:

    标签: design-patterns


    【解决方案1】:
    public Action determimeAction( Object o, List<String> groups ) {
        for ( String group : groups ) {
            if ( ( ( GroupI ) o ).isPartOf( group ) ) {
                Action a = ( ( GroupI ) o ).treatCaseGroup( group );
                if ( a != indecisive ) {  // could this be a.isDecicive()
                    return a;
                }
            }
        }
        return null; // or whatever
    }
    
    public interface GroupI () {
        public Action treatCaseGroup( String group );   // is implemented to know which Action to get.
        public Boolean isPartOf( Stirng group ); // is implemented the same as your example just move the method to your object
    }
    
    public class GroupImpl implements GroupI {
        public Boolean isPartOf( Stirng group ) {
        }
        public Action treatCaseGroup( String group ) {
            // use if, case, factory, or Dep Inection to get the correct action.
        }
    }
    

    在不了解所有逻辑的情况下,这样的事情应该可以工作。

    【讨论】:

    • 谢谢,这会工作!我会等着看是否有其他想法出现
    【解决方案2】:

    查看Visitor design pattern

    本质上,访问者模式就是对不同的静态对象执行不同的操作,而不会将它们绑定得太紧。

    正确地重构您的代码,您只需这样做:

    o.treat();
    

    【讨论】:

    • sry 我不清楚。如果对象是 group1 的一部分,它也可以是 group2、group3 等的一部分,所以如果我调用treat();在我的对象上,它仍然可以以“不确定”结束。另外,最终结果可能是不确定的。如果我完全正确,请纠正我!
    【解决方案3】:

    看看责任链。你将每个 Treat 方法的职责分离出来,建立一个命令链。每个命令都会尝试处理该对象。

    看看这里: http://www.dofactory.com/net/chain-of-responsibility-design-pattern

    【讨论】:

      【解决方案4】:

      这不是一种模式,也不是什么深入的东西(它只解决您询问的特定问题),但是这样的事情会起作用吗?

      Action a;
      Object o;
      
      while (a == indecisive)
      {
          if(objectIsPartOfGroup(o, "Group1"))
              a = treatCaseGroup1();
          if(objectIsPartOfGroup(o, "Group2"))
              a = treatCaseGroup2();
          if(objectIsPartOfGroup(o, "Group3"))
              a = treatCaseGroup3();
       }
      
       return a
      

      【讨论】:

      • sry 我不清楚。如果对象是 group1 的一部分,它也可以是 group2、group3 等的一部分。所以如果我这样做,o,作为 group1 和 2 的一部分,将始终对待 group1 并且始终犹豫不决。
      • @David:根据 Yuval A 所说,访客设计模式可能是您应该采用的方式。
      • 我只是不明白如果访问者属于不同组,访问者如何多次处理单个对象
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      相关资源
      最近更新 更多