假設有兩個類:A
和B
。OO設計問題
A
可以在B
上操作。
我需要能夠查詢A
已運行的所有B
實例。
而對於特定的B
實例,我需要能夠查詢對其進行操作的所有A
實例。
這種問題的優雅(在OO口味..)解決方案是什麼?
假設有兩個類:A
和B
。OO設計問題
A
可以在B
上操作。
我需要能夠查詢A
已運行的所有B
實例。
而對於特定的B
實例,我需要能夠查詢對其進行操作的所有A
實例。
這種問題的優雅(在OO口味..)解決方案是什麼?
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);
}
}
像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
訪問B
的startRecoveringFromOperation()
方法,而隱藏方法從大多數其他類。在其他語言中,您可能會使用其他方法來完成此操作。例如,在C++中,您可以將A
聲明爲B
的friend
。
看來你正在複製數據...是最優雅的設計?順便說一句,我看不到'b'在哪裏定義.. –
這樣我只能通過'A'實例操作,而不是'B'實例... –
@new_perl - 那個'b'是一個錯字,它應該已經'耐心'了(現在已經固定)。我不能說這是否是最優雅的設計,因爲這取決於你想要用它完成什麼。這只是解決問題的一種可能方案。它確實存儲了一些冗餘數據,以簡化爲給定的'B'查找每個'A'的邏輯。是的,這隻允許你通過'A'操作'B',因爲我認爲這是所需的使用模式。如果這不適合你的設計,你當然可以修改它,只要你喜歡。 – aroth
這取決於你使用的是什麼語言,但理論上你可以創建某種列表,並且每次發生一個事件被觸發,其中A在B上操作,你將添加到該列表中。其他情況也是如此。 – Keelx
聽起來像觀察員模式給我。如果你使用Java,也許你需要擴展一些類/接口 –