作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这似乎是一个很容易解决的任务,但我仍然找不到方法。
假设我有两个类
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 对象时,我还必须提供对其调用对象的引用。因为 Square 不拥有任何有关其周围环境的信息。当我需要一些有关主要最高所有者的信息时,情况会变得更糟。然后我必须将各层相互链接,就像 isGridFull()
的情况一样。
在实际代码中,我有 3 个级别的此类依赖关系,而且它已经变得非常困惑。我想知道处理这种情况的好方法。正确的设计是什么?
最佳答案
我同意@Robin,为什么你不直接告诉方 block 他们的邻居呢?
如果你有理由就不要告诉他们,所以我希望接下来的内容对你有帮助)
当你希望依赖关系变弱时,你需要引入新的抽象级别,其中包含有关Grid
、Square
、Worker
的所有信息。前三个类可以互相了解任何事情。据我了解,你已经有了这样的抽象级别:一些“主要的最高所有者”。
因此,让Owner
了解所有内容,并让Grid
、Square
和Worker
转储。
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;
}
}
关于java - 访问当前对象所属的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20270466/
我是一名优秀的程序员,十分优秀!