2013-11-28 130 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你的问题,可能你会得到一个更好的答案。

编辑: 就像一个快速编辑,为什么不告诉广场有关他们的邻居,可以缓解一些事情?