Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问当前对象所属的对象_Java_Design Patterns_Refactoring - Fatal编程技术网

Java 访问当前对象所属的对象

Java 访问当前对象所属的对象,java,design-patterns,refactoring,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 b

这似乎是一项很容易解决的任务,但我还是找不到办法

假设我有两门课

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();
    }
}
现在的问题是,每次我需要启动一个新的Square对象时,我还必须给它的调用对象一个引用。因为广场不具备任何关于其周围环境的信息。当我需要一些关于大老板的信息时,情况就更糟了。然后我必须像在
isGridFull()
的情况下一样将层链接到彼此


在实际代码中,我有三层这样的依赖关系,它已经变得非常混乱。我想知道处理这种情况的好办法。正确的设计是什么?

用一般的方式回答你的问题:不,这不是个好主意。如果代码开始感到凌乱,请重新考虑您的设计

我不是100%确定你想要实现什么,但作为@Oli Charlesworth statet,
这基本上是正确的方法

重新写你的问题,也许你会得到一个更好的答案

编辑:
作为一个快速编辑,你为什么不告诉广场他们的邻居,可以让事情变得轻松一点呢?

我同意@Robin的观点,你为什么不告诉广场他们的邻居呢

如果你有理由,不要告诉他们,因此我希望下一篇文章可能会对你有所帮助)

当您希望依赖性变弱时,您需要引入新的抽象级别,该级别包含有关
网格
正方形
工作者
的所有信息。前三节课可以互相了解。据我所知,您已经有了这样的抽象级别:某个“主要顶级所有者”

因此,让
所有者
了解所有情况,并让
网格
正方形
工作者
转储

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;
  }
}
公共类所有者{
//存储网格、所有相关方块和所有相关工作人员的结构
私有电网;
私有地图;
公共网格getGrid(){
返回网格;
}
公共集合getAllSquares(){
返回squareWorkerMap.values();
} 
公共收集工作人员(平方米){
squareWorkerMap.get(sq);
} 
公共???getSquare(工人){
//实现取决于工人是否可以属于多个正方形
}
}
公共类网格{
私人业主维护业主;
公众收藏{
返回mainTopOwner.getAllSquares();
}
公共收集工作人员(平方米){
返回mainTopOwner.getWorkers(sq);
}
}
公共课广场{
私人业主维护业主;
公共集合getWorkers(){
返回mainTopOwner.getWorkers(此);
}
公共网格getGrid(){
返回mainTopOwner.getGrid;
} 
}
公社工人{
私人业主维护业主;
公共广场{
返回mainTopOwner.getSquare(此)
}
公共网格getGrid(){
返回mainTopOwner.getGrid;
}
}

传递
这是正确的处理方法。虽然一般来说,如果东西需要访问其所有者的所有者,设计可能需要重新思考。@ayan ahmedov,我的回答对你有帮助吗?如果没有,请提供更多详细信息或对其原因发表评论。我仍然可以帮助你解决这个问题。
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;
  }
}