基于组件的模式选择对象状态的建议

时间:2012-04-05 15:17:44

标签: c# design-patterns

我正在研究实现这个的最佳方法,基本上是一个适合的模式,给定一个与兄弟姐妹和孩子有关系的对象。

我们有一套复杂的规则来设置每个对象的状态

e.g。

  • n个“类型”A的兄弟对象然后每个的状态是x
  • n兄弟对象“类型”A和“类型”B然后每个的状态是y

这个

可能有3到4个变种

对于每个兄弟对象,其子对象的组合将阻止它的“类型”

希望这很清楚,如果您认为我可以添加更多说明,请发表评论吗?

编辑:

添加了一些伪代码

状态将保持在Foo objecst(不是FooBar或Bar)旁边,并且状态在用户驱动的事件上更新(用户可以混合使用Foos和Bars,然后生成事件以重新介入,设置状态并持久保存到数据库)

希望这会有所帮助

void Main()
{


    var foobar = GrabAFooBar();
    //Each Foo will have its state set based on the rules in the question
    //eg
    //foobar has 2 Foos both of which only contain BarType1 then both foos have a State of StateOne
    //foobar has 2 foos, one has a BarType1 one has a BarType2 both foos have a State of StateTwo
    //foobar has 2 foos, one has a BarType1 and BarType3 one has a BarType2 both foos have a State of StateThree
    //effectivaly there are 5 States (currently) and a  well defined set of combinations
    //All foos will have the same state at the end of the process (there will never be a mix)

}

FooBar GrabAFooBar()
{
    //return a FooBar from data
}

// Define other methods and classes here

    class FooBar
    {
        List<Foo> Foos {get;set;}

    }
    class Foo
    {
        public List<Bar> Item {get;set;}
        public State state {get;set;}
    }
    abstract class Bar
    {

    }

    class BarType1 : Bar
    {
    }


    class BarType2 : Bar
    {
    }


    class BarType3 : Bar
    {
    }

    enum State
    {
        StateOne,
        StateTwo,
        StateThree
    }

3 个答案:

答案 0 :(得分:2)

责任链听起来像是一种可能的模式。

链的每个处理程序将负责“匹配”您的对象并返回状态或将对象传递给链中的下一个处理程序。您可以在链中订购处理程序,这样即使两个或多个处理程序接受该对象,链的顺序也将决定您的优先级。

答案 1 :(得分:0)

我建议将枚举替换为将管理逻辑的实际类:

public abstract class State {
    public bool AppliesTo( Foo foo );
}

public class StateOne : State {
    public override bool AppliesTo( Foo foo ){
        return foo.Item.All(x => x is Bar1);
    }
}
//etc.

“x is Bar1”部分不好,你可以使用双重调度。

答案 2 :(得分:0)

除非您希望听到Object Oriented Programming等答案,否则我认为没有这种模式。

你有很多选择,例如:

  1. 通过调用计算状态的方法/函数计算状态按需,并将其保存在属性State中)

  2. 创建一个属性State getter,每次调用时都会计算状态

  3. 将CollectionChanged处理程序附加到兄弟集合并自动更新状态在集合更改后

  4. 这些选择之间的选择取决于您的家属变化的频率,您需要多久查看一次州,以及您的计算费用。

    如果规则不会发生很大变化,那么您可以对它们进行硬编码。但如果他们改变了,你应该考虑使用规则引擎,例如Biztalk