2014-06-14 55 views
0

我正在使用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; 
    } 
} 

。特別是當我有這樣一個關係時:根 - >孩子 - >孩子 - >孩子......。

有沒有解決這個問題的設計模式。據我所知有Mediator模式但使用它,但仍然沒有帶來多少,因爲我仍然需要基本上做同樣的事情。

+0

'複合'是一個很好的,不是嗎?你也可以看看'裝飾者'。這兩個處理父子層次結構。 – EpicPandaForce

+0

@朱因登恩,沒有。當父母子女的行爲類似時,複合很好。在我的情況下,我需要修改特定的父項。同樣也適用於裝飾者。 –

回答

1

做到這一點的最好方法是使用某種依賴注入。控制器然後自動解決依賴關係。我假設你不需要任何提供它的企業框架,所以你必須以某種方式手動解決依賴關係。

中介模式的目的是簡單地將依賴關係mamagement封裝在一個地方。在我的解決方案中,根元素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; 
    } 
} 
+0

依賴注入可能是您需要的。查看[afterburner.fx](https://github.com/AdamBien/afterburner.fx)通過註釋管理依賴注入的框架,這將大量減少您需要編寫的代碼量。 –