實現物件的複用——享元模式(四)

Liuwei-Sunny發表於2012-06-15

14.5 帶外部狀態的解決方案

       Sunny軟體公司開發人員通過對圍棋棋子進行進一步分析,發現雖然黑色棋子和白色棋子可以共享,但是它們將顯示在棋盤的不同位置,如何讓相同的黑子或者白子能夠多次重複顯示且位於一個棋盤的不同地方?解決方法就是將棋子的位置定義為棋子的一個外部狀態,在需要時再進行設定。因此,我們在圖14-4中增加了一個新的類Coordinates(座標類),用於儲存每一個棋子的位置,修改之後的結構圖如圖14-5所示:

14-5 引入外部狀態之後的圍棋棋子結構圖

       在圖14-5中,除了增加一個座標類Coordinates以外,抽象享元類IgoChessman中的display()方法也將對應增加一個Coordinates型別的引數,用於在顯示棋子時指定其座標,Coordinates類和修改之後的IgoChessman類的程式碼如下所示:

//座標類:外部狀態類
class Coordinates {
	private int x;
	private int y;
	
	public Coordinates(int x,int y) {
		this.x = x;
		this.y = y;
	}
	
	public int getX() {
		return this.x;
	}
	
	public void setX(int x) {
		this.x = x;
	}
	
	public int getY() {
		return this.y;
	}
	
	public void setY(int y) {
		this.y = y;
	}
} 

//圍棋棋子類:抽象享元類
abstract class IgoChessman {
	public abstract String getColor();
	
	public void display(Coordinates coord){
		System.out.println("棋子顏色:" + this.getColor() + ",棋子位置:" + coord.getX() + "," + coord.getY() );	
	}
}

       客戶端測試程式碼修改如下:

class Client {
	public static void main(String args[]) {
		IgoChessman black1,black2,black3,white1,white2;
		IgoChessmanFactory factory;
        
        //獲取享元工廠物件
		factory = IgoChessmanFactory.getInstance();

        //通過享元工廠獲取三顆黑子
		black1 = factory.getIgoChessman("b");
		black2 = factory.getIgoChessman("b");
		black3 = factory.getIgoChessman("b");
		System.out.println("判斷兩顆黑子是否相同:" + (black1==black2));

        //通過享元工廠獲取兩顆白子
		white1 = factory.getIgoChessman("w");
		white2 = factory.getIgoChessman("w");
		System.out.println("判斷兩顆白子是否相同:" + (white1==white2));

        //顯示棋子,同時設定棋子的座標位置
		black1.display(new Coordinates(1,2));
		black2.display(new Coordinates(3,4));
		black3.display(new Coordinates(1,3));
		white1.display(new Coordinates(2,5));
		white2.display(new Coordinates(2,4));
	}
}

       編譯並執行程式,輸出結果如下:

判斷兩顆黑子是否相同:true

判斷兩顆白子是否相同:true

棋子顏色:黑色,棋子位置:12

棋子顏色:黑色,棋子位置:34

棋子顏色:黑色,棋子位置:13

棋子顏色:白色,棋子位置:25

棋子顏色:白色,棋子位置:24

       從輸出結果可以看到,在每次呼叫display()方法時,都設定了不同的外部狀態——座標值,因此相同的棋子物件雖然具有相同的顏色,但是它們的座標值不同,將顯示在棋盤的不同位置。

【作者:劉偉  http://blog.csdn.net/lovelion

相關文章