软件构造——Lab2

① Implement ConcreteVerticesGraph
在这个ADT中要求只用点的类来实现一个图,我采用的存储边的结构是两个图
private Map source=new HashMap<>(); //用于连到该点的点集图
private Map target=new HashMap<>(); //用于存储该点能连到的点集图
虽然这样在每次连一条边的时候需要同时更新这两个属性,但在需要或取边的信息的时候却非常方便。

②GoAndChessGame
我首先首先设计了一个抽象类Game.java,其包含
两名玩家:
private Player P1;
Private Player P2;
具体子类:
class Player //玩家类
class Piece //棋子类
class Board //棋盘类
抽象方法(在两个扩展类中具体实现):
//用于初始化棋盘,棋子
public abstract void init(Player p1,Player p2);
//围棋的放子方法
public abstract boolean putPiece(Player player,Piece piece,int x,int y);
//象棋的移子方法
public abstract boolean movePiece(Player player,int x1,int y1,int x2,int y2);
//围棋的提子方法
public abstract boolean getPiece(Player player,int x,int y);
//象棋的吃子方法
public abstract boolean eatPiece(Player player,int x1,int y1,int x2,int y2);
//搜索棋盘上某位置的信息
public abstract String search(int x,int y);
//获得棋盘上某点棋子姓名方法
public abstract String get(int x,int y);
//用于显示棋盘
public abstract void showBoard(Player p1,Player p2);
mutability:子类和方法
immutability:private Player P1; Private Player P2;
AF:Game(p1,p2)={a game contains two player p1 and p2}
RI:P1和P2不能重名
safety from rep exposure:玩家为private,不能修改

之后我用两个类去扩展了这个抽象类,分别为ChessGame和GoGame

ChessGame:
Rep:Board chessBoard; //象棋棋盘
覆写方法如下:
@Override public void init(Player p1,Player p2) //象棋棋盘的初始方法
@Override public boolean movePiece(Player player, int x1, int y1, int x2, int y2) //象棋游戏的移子方法
@Override public boolean eatPiece(Player player, int x1, int y1, int x2, int y2) //象棋游戏的吃子方法
@Override public String search(int x,int y)//象棋的搜索方法
@Override public void showBoard(Player p1,Player p2) //象棋的显示棋盘方法

GoGame
Rep:Board goBoard; //围棋棋盘
@Override public void init(Player p1,Player p2) //围棋棋盘的初始方法
@Override public boolean putPiece(Player player, Piece piece, int x, int y) //围棋的放子方法
@Override public boolean getPiece(Player player, int x, int y) //围棋的提子方法
@Override public String search(int x,int y)//围棋的搜索方法
@Override public void showBoard(Player p1,Player p2) //围棋的显示棋盘方法

这样进行覆用可以极大地减少不必要的代码重复。

你可能感兴趣的:(软件构造——Lab2)