我正在研究实现这个的最佳方法,基本上是一个适合的模式,给定一个与兄弟姐妹和孩子有关系的对象。
我们有一套复杂的规则来设置每个对象的状态
e.g。
这个
可能有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
}
答案 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
等答案,否则我认为没有这种模式。
你有很多选择,例如:
通过调用计算状态的方法/函数计算状态按需,并将其保存在属性State
中)
创建一个属性State
getter,每次调用时都会计算状态
将CollectionChanged处理程序附加到兄弟集合并自动更新状态在集合更改后
这些选择之间的选择取决于您的家属变化的频率,您需要多久查看一次州,以及您的计算费用。
如果规则不会发生很大变化,那么您可以对它们进行硬编码。但如果他们改变了,你应该考虑使用规则引擎,例如Biztalk