对象创建取决于调用者

本文关键字:调用者 取决于 创建 对象 | 更新日期: 2023-09-27 17:54:11

我有一个类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,所以它会显示"新的"子元素。

这个效果很好。

现在我有一个用例,也有一个Parent类。它有一个子节点,然后演示者显示"两者"(传输是父节点,驱动是子节点,演示者显示传输及其驱动)。

在父类中可以搜索子类的数据(比如驱动程序的名称):

public class Parent : MyObject
{
    private Child child;
    public void FindChild()
    {
        child.find();
    }
}

但是在这种情况下,新的Parent应该由演示者显示。相反,正如您在ChildFind()中看到的那样,子节点由演示者显示。

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

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

对象创建取决于调用者

让你的方法只做一件事。在基类中设置活动,在父类和子类中重载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;
  }
}

对我来说,感觉Presenter知道MyObject MyObject知道Presenter。它不仅仅是紧密耦合,而且是双向紧密耦合。

如果您采用DDD或洋葱体系结构方法,您可以使域模型的ParentChild成员,它们不依赖/依赖/知道域模型之外的任何东西。遵循洋葱体系结构,您可能会有一个域服务层,它知道这个域模型并实现Find()逻辑。然后在上面,也许是一个包含Presenter以及围绕每个用例的规则的应用层。(例如,一个给定的用例可以创建一个Parent,找到它的Child并显示Parent。或者你需要它做的任何事情;此时,您将拥有可以根据需要组装的高级构建块。)

无论如何,我认为分析应用程序的高级设计,识别需要改进的地方,并寻找可能改进它的现有解决方案模式是非常好的。荣誉!