【问题标题】:design pattern for parent-child structure父子结构的设计模式
【发布时间】:2014-06-14 15:28:48
【问题描述】:

我正在开发一个使用 JavaFX 的项目,并且类通常有多达 800-1200 行。我们使用 fxml 来显示 Node 元素,但这些类仍然非常复杂。这就是我要问的具体内容:

一个类ReservationUI 包含子部分,它们现在被模块化为内部类。它又具有子部分。并且此类可以访问 ReservationUI 的字段。现在我喜欢将它们提取到自己的类中,但现在我需要访问父类。

class A{
  int x; int y;
  B b;
  public A(){
    b = new B();
    b.display();
  }
  private class B{
    private C c;
   /* modify x */ 
  }

  private class C{ 
  /* modify x and y */
  }
}

当我现在提取它们时,我的依赖关系更糟:

class A {
int x; int y; 
B b;
  public A(){
    b = new B(this);
    b.display();
  }
}
class B {
  C c;
  A a;
  public B ( A parent ){ 
  c = new C(this, parent);
  a = parent;
  /* call A.modifyX(c.get) */
}

class C{
  A a;
  B b;
  public C( B parent , A root){
   a = root;
   b = parent;
  }
}

我认为这里的模块化已经大错特错了。尤其是当我有这样的关系时:root -> child -> child -> child ...。

是否有解决此问题的设计模式。据我所知,有 Mediator 模式,但使用它,仍然没有带来太多,因为我仍然需要基本上做同样的事情。

【问题讨论】:

  • 'Composite' 很好,不是吗?您还可以查看“装饰器”。这两个处理父子层次结构。
  • @Zhuinden 好吧,不。当父子行为相似时,复合很好。就我而言,我需要修改特定的父级。同样适用于装饰器。

标签: java design-patterns javafx


【解决方案1】:

最好的方法是使用某种依赖注入。然后控制器自动解决依赖关系。我假设您不需要任何提供它的企业框架,因此您必须以某种方式手动解决依赖关系。

中介者模式的目的是将依赖管理简单地封装在一个地方。在我的解决方案中,根元素 A 充当中介。它的副作用是子元素以未初始化的状态在短时间内存在。为了解决这个问题,你也可以引入Builder模式。

interface IA{
    /*...*/
    void modifyX(int x);
}
class A implements IA{
  int x; int y; 
  IB b;
  IC c;
  public A(){
    b = new B();
    c = new C();
    resolveDependencies();
    b.init();
    b.display();
  }
  public void resolveDependencies(){
    b.setC(c);
    b.setA(this);
    c.setA(this);
    c.setB(b);
  }
}
interface IB {
    void setC(IC c);
    void setA(IA a);
    void init();
    void display();
}
class B implements IB{
  IC c;
  IA a;
  public B (){ 
  }
  @Override
  public void setC(IC c){
    this.c = c;
  }
  @Override
  public void setA(IA a){
    this.a = a;
  }
  @Override
  public void init(){
    /* call A.modifyX(c.get) */
  }
}
interface IC {
    void setA(IA a);
    void setB(IB b);
}
class C implements IC{
  IA a;
  IB b;
  public C( ){
  }
  @Override
  public void setA(IA a){
    this.a = a;
  }
  @Override
  public void setB(IB b){
    this.b = b;
  }
}

【讨论】:

  • 依赖注入可能是你需要的。看看afterburner.fx 通过注解管理依赖注入的框架,这将大大减少您需要编写类似这样的代码量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2014-12-31
相关资源
最近更新 更多