java - 亲子结构的设计模式

标签 java design-patterns javafx

我正在开发一个使用 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 ... 。

有没有一种设计模式可以解决这个问题。据我所知,有中介者模式,但使用它仍然没有带来太多,因为我仍然需要基本上做同样的事情。

最佳答案

做到这一点的最好方法是使用某种依赖注入(inject)。然后 Controller 自动解决依赖关系。我假设您不需要任何提供它的企业框架,因此您必须以某种方式手动解决依赖关系。

中介者模式的目的是将依赖管理简单地封装在一个地方。在我的解决方案中,根元素 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;
  }
}

关于java - 亲子结构的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24221465/

相关文章:

java - 我可以使用 FileReader 读取包含图像和视频(例如 epub 文件)和文本的文件吗?在性能方面是否建议这样做?

JavaFX GUI 多线程问题

model-view-controller - Zend 框架 : How do I utilize MVC for our mobile website

c++ - 生成具有不同 Ctor 参数的对象实例化的模式

JavaFX,将anchorpane元素与另一个文件中的FXML交换

java - 导致堆空间用尽的可能原因是什么?是否有避免它的最佳实践?

c# - 窗口服务和 C# 设计模式问题

java - fxml 中返回空指针的按钮

text - 如何在 JavaFX 中让文本内容在一段时间后消失?

java - Spring Security的DaoAuthenticationProvider : MD5 or SHA-256?的密码编码器