實現物件的複用——享元模式(四)
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 棋子顏色:黑色,棋子位置:1,2 棋子顏色:黑色,棋子位置:3,4 棋子顏色:黑色,棋子位置:1,3 棋子顏色:白色,棋子位置:2,5 棋子顏色:白色,棋子位置:2,4 |
從輸出結果可以看到,在每次呼叫display()方法時,都設定了不同的外部狀態——座標值,因此相同的棋子物件雖然具有相同的顏色,但是它們的座標值不同,將顯示在棋盤的不同位置。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 實現物件的複用——享元模式(五)物件模式
- 實現物件的複用——享元模式(三)物件模式
- 實現物件的複用——享元模式(二)物件模式
- 實現物件的複用——享元模式(一)物件模式
- 享元模式(c++實現)模式C++
- 物件池與享元模式物件模式
- iOS設計模式 (四)享元模式iOS設計模式
- 設計模式之:享元模式FlyweightPattern的實現設計模式
- 《設計模式四》觀察、組合、享元模式設計模式
- Swift 實戰-享元模式Swift模式
- 實驗13:享元模式模式
- 享元模式模式
- 第22章 物件共享,避免建立多物件——享元模式物件模式
- 設計模式 | 享元模式及典型應用設計模式
- 六、享元模式模式
- 享元模式初探模式
- 設計模式----享元模式設計模式
- 設計模式-享元模式設計模式
- 享元模式(Flyweight)模式
- 設計模式之享元模式設計模式
- javascript設計模式享元模式JavaScript設計模式
- 設計模式(十七):享元模式設計模式
- 享元模式 核心程式碼模式
- 分析模式:可複用的物件模型模式物件模型
- 設計模式系列13–享元模式設計模式
- 【大道模式】享元模式-FlyWeight Pattern模式
- 極簡設計模式-享元模式設計模式
- Python設計模式-享元模式Python設計模式
- Java設計模式11——享元模式Java設計模式
- 軟體設計模式————(享元模式)設計模式
- Android開發Message原始碼分析【享元模式|物件池】Android原始碼模式物件
- 【web前端】用javascript實現物件的深複製Web前端JavaScript物件
- 設計模式學習筆記(十二)享元模式及其應用設計模式筆記
- 《JavaScript設計模式與開發實踐》模式篇(9)—— 享元模式JavaScript設計模式
- C#設計模式(13)——享元模式C#設計模式
- Java設計模式之(十一)——享元模式Java設計模式
- 設計模式系列13--享元模式設計模式
- C#設計模式之享元模式C#設計模式