我有一个班级Presenter
决定哪个"班级"显示给用户:
public class Presenter
{
public MyObject ActiveObject { get; set;}
}
我可以展示的所有课程都来自MyObject
:
public abstract class MyObject
{
protected Presenter Presenter;
}
可以呈现的一个类是Child
:
public class Child : MyObject
{
public void Find()
{
Results results = ChildSearch.Find(this);
Child newChild = new Child(results);
Presenter.ActiveObject = newChild;
}
}
当调用Find()
方法时,会创建一个新子项并将其发送到Presenter,以便显示" new"子。
这很有效。
现在我有一个用例,还有一个Parent
类。它有一个孩子,然后主持人显示"两个" (运输将是父母,驾驶员是孩子,演示者显示与其司机的交通)。
在Parent内部,可以搜索孩子的数据(比如驱动程序的名称):
public class Parent : MyObject
{
private Child child;
public void FindChild()
{
child.find();
}
}
但在这种情况下,演示者应该显示新的父母。相反,正如您在Find()
Child
中看到的那样,孩子会由演示者展示。
这表明我的设计很糟糕,但我真的不知道如何做到这一点。
如果你知道这个问题的更好的标题,请建议一个。有什么模式适合我的问题吗?
答案 0 :(得分:0)
让你的方法只做一件事。在基类中激活set,并在父和子中重载find方法,这样每种MyObject都可以定义哪个对象必须是活动的。
public abstract class MyObject
{
protected Presenter Presenter;
protected abstract MyObject Find();
protected void FindAndSetAcive()
{
MyObject newActiveObject = Find();
Presenter.ActiveObject = newActiveObject;
}
}
public class Child : MyObject
{
public override MyObject Find()
{
Results results = ChildSearch.Find(this);
Child newChild = new Child(results);
return newChild;
}
}
public class Parent: MyObject
{
public override MyObject Find()
{
child.find();
// here you can do what you have to do to get the new "active element"
return this;
}
}
答案 1 :(得分:0)
对我而言,Presenter
知道MyObject
和 MyObject
了解Presenter
。它不仅紧密耦合,而且两种方式紧密耦合。
如果采用DDD或Onion Architecture方法,您可以建立域模型的Parent
和Child
成员,这些成员不依赖/依赖/知道关于领域模型之外的任何事情。在Onion Architecture之后,您可以拥有一个知道此域模型的域服务层,并实现Find()
逻辑。然后,最重要的是,可能是包含Presenter
的应用层以及每个用例的规则。 (例如,给定的用例可能会创建Parent
,找到它的Child
并显示Parent
。或者无论你需要它做什么;那时你就有了高你可以根据需要组装的级别构建块。)
无论如何,我认为您正在分析应用程序的高级设计,识别需要改进的领域并寻找可能改进它的现有解决方案模式。奖励!