2013-11-28 39 views
0

解決這個問題看起來相當容易,但我仍然無法找到一種方法。訪問當前對象是其中一部分的對象

說我有兩個班

class Grid { 
    private Square[][] sq; 
    public Grid(){ 
     // don't like this 
     seq[0][0] = new Square(this); 
     // etc. 
    } 
    public Collection<Square> getNeighbours(Square sq){ ... } 
    public boolean isFull(){ ... } 
} 

class Square { 
    private Grid grid; 
    Set<Worker> set; 
    public Square(Grid grid){ 
     this.grid = grid; 
     set.add(new Worker(this)); 
    } 
    public void dealWithNeighbours(){ 
     for(Square s : grid.getNeighbours()) {....} 
    } 
    public boolean isGridFull(){ 
     // now it is officially stupid 
     return grid.isFull(); 
    } 
} 

它甚至更糟,當我添加一個新層,這個喜歡:

class Worker extends Thread{ 
    private final Square sq; 
    public(Square sq){ 
     this.sq = sq; 
    } 
    private boolean anyMoreFreeSpace(){ 
     !sq.isGridFull(); 
    } 
    @Override 
    public void run(){ 
     if(anyMoreFreeSpace()) { ... } 
     ... 
    } 

} 

現在的問題是,每次我需要啓動一個新的Square對象,我也必須給它的調用對象提供一個引用。因爲廣場沒有任何關於周圍環境的信息。當我需要關於主要業主的一些信息時,情況會變得更糟。然後,我必須將圖層鏈接到對方,例如isGridFull()

在真實的代碼中,我有3級這樣的依賴關係,它已經變得非常混亂。我想知道處理這種情況的好方法。這將是什麼正確的設計?

+2

傳遞'this'是處理它的正確方法。儘管一般情況下,如果事情需要訪問其擁有者的所有者,設計可能需要重新考慮。 –

+0

@ayan ahmedov,我的回答對你有幫助嗎?如果不是,請提供更多詳細信息或對其原因進行評論。我仍然可以嘗試幫助你解決這個問題。 –

回答

1

我同意@Robin,爲什麼你不只是告訴他們的鄰居廣場?

如果你有理由不告訴他們,所以我希望未來可以對你有所幫助)

當你想依賴性變弱,你需要引入擁有大約Grid的所有信息新的抽象水平,SquareWorker。前三個班級可以相互瞭解任何事情。據我瞭解,你已經有了這樣的抽象層次:一些「主要頂級所有者」。

因此,使Owner知道所有,並使GridSquareWorker轉儲。

public class Owner { 
    //structure that store grid, all related squares and all related workers 
    private Grid grid; 
    private Map<Square, Collection<Worker>> squareWorkerMap;  

    public Grid getGrid() { 
    return grid; 
    } 

    public Collection<Square> getAllSquares() { 
    return squareWorkerMap.values(); 
    } 

    public Collection<Worker> getWorkers(Square sq) { 
    squareWorkerMap.get(sq); 
    } 

    public ??? getSquare(Worker worker) { 
    //implementation depends on if worker can belong to many squares 
    } 
} 

public class Grid { 
    private Owner mainTopOwner; 

    public Collection<Square> getSquares() { 
    return mainTopOwner.getAllSquares(); 
    } 
    public Collection<Worker> getWorkers(Square sq) { 
    return mainTopOwner.getWorkers(sq); 
    } 
} 

public class Square { 
    private Owner mainTopOwner; 

    public Collection<Workers> getWorkers() { 
    return mainTopOwner.getWorkers(this); 
    } 
    public Grid getGrid() { 
    return mainTopOwner.getGrid; 
    } 
} 

public class Worker { 
    private Owner mainTopOwner; 

    public Square getSquare() { 
    return mainTopOwner.getSquare(this) 
    } 
    public Grid getGrid() { 
    return mainTopOwner.getGrid; 
    } 
} 
0

以通用的方式回答你的問題:不是不是一個好主意。如果代碼開始感到混亂,請重新考慮設計!

我不是100%確定,你試圖達到什麼目的,但作爲@Oli Charlesworth statet,this是基本正確的方法。

Re wright你的問題,可能你會得到一個更好的答案。

編輯: 就像一個快速編輯,爲什麼不告訴廣場有關他們的鄰居,可以緩解一些事情?