根据调用者创建对象

时间:2015-06-08 15:01:24

标签: c# design-patterns

我有一个班级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中看到的那样,孩子会由演示者展示。

这表明我的设计很糟糕,但我真的不知道如何做到这一点。

如果你知道这个问题的更好的标题,请建议一个。有什么模式适合我的问题吗?

2 个答案:

答案 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。它不仅紧密耦合,而且两种方式紧密耦合。

如果采用DDDOnion Architecture方法,您可以建立域模型的ParentChild成员,这些成员不依赖/依赖/知道关于领域模型之外的任何事情。在Onion Architecture之后,您可以拥有一个知道此域模型的域服务层,并实现Find()逻辑。然后,最重要的是,可能是包含Presenter的应用层以及每个用例的规则。 (例如,给定的用例可能会创建Parent,找到它的Child并显示Parent。或者无论你需要它做什么;那时你就有了高你可以根据需要组装的级别构建块。)

无论如何,我认为您正在分析应用程序的高级设计,识别需要改进的领域并寻找可能改进它的现有解决方案模式。奖励!