2011-07-25 109 views
1

假設有兩個類:ABOO設計問題

A可以在B上操作。

我需要能夠查詢A已運行的所有B實例。

而對於特定的B實例,我需要能夠查詢對其進行操作的所有A實例。

這種問題的優雅(在OO口味..)解決方案是什麼?

+1

這取決於你使用的是什麼語言,但理論上你可以創建某種列表,並且每次發生一個事件被觸發,其中A在B上操作,你將添加到該列表中。其他情況也是如此。 – Keelx

+0

聽起來像觀察員模式給我。如果你使用Java,也許你需要擴展一些類/接口 –

回答

0
import java.util.*; 
class A { 
    void operate(B b) { 
     operatedOn.add(b); 
     b.operatedOnBy.add(this); 
    } 
    final Set<B> operatedOn = new HashSet<B>(); 
} 
class B { 
    final Set<A> operatedOnBy = new HashSet<A>(); 
} 
public class Main { 
    public static void main(String[] args) { 
     A a=new A(); 
     B b=new B(); 
     a.operate(b); 
     System.out.println(a+" "+a.operatedOn); 
     System.out.println(b+" "+b.operatedOnBy); 
    } 
} 
1

像Java我會做類似語言:

package com.whatever.blah; 

public class A { 
    private Set<B> patients = new HashSet<B>; 

    public void operateOn(B patient) { 
     patient.startRecoveringFromOperation(this); 
     patients.add(patient); 
    } 

    public List<B> getPatients() { 
     return patients; 
    } 
} 

public class B { 
    private Set<A> surgeons = new HashSet<A>; 

    //this has package access to `A` can access it but other classes can't 
    void startRecoveringFromOperation(A theSurgeon) { 
     surgeons.add(theSurgeon); 
    } 

    public List<A> getSurgeons() { 
     return surgeons; 
    } 
} 

這個真沒有做什麼特別的,除了使用package access允許A訪問BstartRecoveringFromOperation()方法,而隱藏方法從大多數其他類。在其他語言中,您可能會使用其他方法來完成此操作。例如,在C++中,您可以將A聲明爲Bfriend

+0

看來你正在複製數據...是最優雅的設計?順便說一句,我看不到'b'在哪裏定義.. –

+0

這樣我只能通過'A'實例操作,而不是'B'實例... –

+0

@new_perl - 那個'b'是一個錯字,它應該已經'耐心'了(現在已經固定)。我不能說這是否是最優雅的設計,因爲這取決於你想要用它完成什麼。這只是解決問題的一種可能方案。它確實存儲了一些冗餘數據,以簡化爲給定的'B'查找每個'A'的邏輯。是的,這隻允許你通過'A'操作'B',因爲我認爲這是所需的使用模式。如果這不適合你的設計,你當然可以修改它,只要你喜歡。 – aroth