棋盘布局分析:
国际象棋棋盘有64个格子,我们通过Tile类表示格子,通过构造函数,当我们构造一个新的tile实例时,对应的会产生一个tile坐标,这个坐标即为传递给构造函数的相应内容。我们把这个类定义为抽象类,只需在子类中定义即可。
我们还需要判断某个tile是否被占用,如果未被占用,需要返回null。我们创建EmptyTile类表示空格子,它会调用父类的构造函数。
Tile类分析:
第一版:tile=OccupiedTile+EmptyTile
将格子分为被占用和未被占用两类(注意tile是抽象类不能被实例化)
public abstract class Tile {
protected final int tileCoordinate;
private Tile(int tileCoordinate){
this.tileCoordinate = tileCoordinate;
}
public abstract boolean isTileOccupied();
public abstract Piece getPiece(); //piece类后在后面定义
public static final class EmptyTile extends Tile {
EmptyTile(final int coordinate){
super(coordinate);
}
@Override //重写以下方法
public boolean isTileOccupied(){
return false;
}
public static final class OccupiedTile extends Tile {
private final Piece pieceOnTile;
OccupiedTile(int tileCoordinate, Piece pieceOnTile){
super(tileCoordinate);//调用父类建立顶部坐标的构造函数
this.pieceOnTile = pieceOnTile;
}
@Override
public boolean isTileOccupied(){
return true;
}
@Override
public Piece getPiece(){
return this.pieceOnTile;
}
}//定义被占领的格子
在Tile类中声明一个新的数字字段整数:
private static final Map<Integer,EmptyTile> EMPTY_TILES_CACHE = createAllPossibleEmptyTiles();
private static Map<Integer,EmptyTile> createAllPossibleEmptyTiles(){
final Map<Integer,EmptyTile> emptyTileMap = new HashMap<>();
for(int i = 0; i < 64; i++){
emptyTileMap.put(i, new EmptyTile(i));
}
Collections.unmodifiableMap(emptyTileMap);//依赖的新库为谷歌第三方库(guava-18.0番石榴)
return ImmutableMap.copyOf(emptyTileMap);
}
public static Tile createTile(final int tileCoordinate,final Piece piece){
return piece != null ? new OccupiedTile(tileCoordinate, piece) : EMPTY_TILES_CACHE.get(tileCoordinate);
}
Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。
Map讲解
createTile解释:使构造函数私有化,将格子坐标传入,返回时进行判断。通过这个方法,任何人都可以在类上创建实例。