访问当前对象所属的对象

时间:2013-11-28 16:03:59

标签: java design-patterns refactoring

要解决这个问题似乎相当容易,但我无法找到方法。

说我有两个班级

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 个答案:

答案 0 :(得分:1)

我同意@Robin,为什么你不直接告诉他们的邻居?

如果你有理由不告诉他们,那么我希望下一个可能对你有所帮助)

当您希望依赖关系变弱时,您需要引入新的抽象级别,其中包含有关GridSquareWorker的所有信息。前三个课程可以互相了解。据我所知,你已经有了这样的抽象层次:一些“主要顶级所有者”。

因此,让Owner了解所有内容,并使Grid SquareWorker转储。

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;
  }
}

答案 1 :(得分:0)

以通用的方式回答你的问题:不是不是一个好主意。如果代码开始变得混乱,重新考虑你的设计!

我不是百分百肯定,你想要实现的目标,但正如@Oli Charlesworth statet所说,this基本上是正确的方式。

重新审视你的问题,那么你可能会得到一个更好的答案。

修改 就像快速编辑一样,为什么不告诉他们邻居的广场,可以稍微放松一下呢?