設計模式C 實現(9) 享元模式

2021-06-02 01:24:40 字數 3731 閱讀 4129

分類: 軟體設計模式c++實現

2011-08-11 08:41

26人閱讀收藏

舉報 軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c++寫了個小例子,加深一下理解。主要參考《大話設計模式》和《設計模式:可復用物件導向軟體的基礎》(dp)兩本書。本文介紹享元模式的實現。

舉個圍棋的例子,圍棋的棋盤共有361格,即可放361個棋子。現在要實現乙個圍棋程式,該怎麼辦呢?首先要考慮的是棋子棋盤的實現,可以定義乙個棋子的類,成員變數包括棋子的顏色、形狀、位置等資訊,另外再定義乙個棋盤的類,成員變數中有個容器,用於存放棋子的物件。下面給出**表示:

棋子的定義,當然棋子的屬性除了顏色和位置,還有其他的,這裡略去。這兩個屬性足以說明問題。

view plain

copy to clipboard

//棋子顏色

enum piececolor ;  

//棋子位置

struct piecepos  

};  

//棋子定義

class piece  

~piece() {}  

virtual

void draw() {}  

};  

class blackpiece: public piece  

~blackpiece() {}  

void draw() ;  

class whitepiece: public piece  

~whitepiece() {}  

void draw() ;  

view plain

//棋子顏色

enum piececolor ;  

//棋子位置

struct piecepos  

};  

//棋子定義

class piece  

~piece() {}  

virtual

void draw() {}  

};  

class blackpiece: public piece  

~blackpiece() {}  

void draw() ;  

class whitepiece: public piece  

~whitepiece() {}  

void draw() ;  

棋盤的定義:

view plain

copy to clipboard

class pieceboard  

~pieceboard()   

void setpiece(piececolor color, piecepos pos) //一步棋,在棋盤上放一顆棋子

else

m_vecpiece.push_back(piece);  //加入容器中

}  void clear() //釋放記憶體

};  

view plain

class pieceboard  

~pieceboard()   

void setpiece(piececolor color, piecepos pos) //一步棋,在棋盤上放一顆棋子

else

m_vecpiece.push_back(piece);  //加入容器中

}  void clear() //釋放記憶體

};  

客戶的使用方式如下:

view plain

copy to clipboard

int main()    

view plain

int main()    

可以發現,棋盤的容器中存放了已下的棋子,而每個棋子包含棋子的所有屬性。一盤棋往往需要含上百顆棋子,採用上面這種實現,占用的空間太大了。如何改進呢?用享元模式。其定義為:運用共享技術有效地支援大量細粒度的物件。

在圍棋中,棋子就是大量細粒度的物件。其屬性有內在的,比如顏色、形狀等,也有外在的,比如在棋盤上的位置。內在的屬性是可以共享的,區分在於外在屬性。因此,可以這樣設計,只需定義兩個棋子的物件,一顆黑棋和一顆白棋,這兩個物件含棋子的內在屬性;棋子的外在屬性,即在棋盤上的位置可以提取出來,存放在單獨的容器中。相比之前的方案,現在容器中僅僅存放了位置屬性,而原來則是棋子物件。顯然,現在的方案大大減少了對於空間的需求。

關注pieceboard 的容器,之前是vectorm_vecpiece,現在是vectorm_vecpos。這裡是關鍵。

棋子的新定義,只包含內在屬性:

view plain

copy to clipboard

//棋子顏色

enum piececolor ;  

//棋子位置

struct piecepos  

};  

//棋子定義

class piece  

~piece() {}  

virtual

void draw() {}  

};  

class blackpiece: public piece  

~blackpiece() {}  

void draw()   

};  

class whitepiece: public piece  

~whitepiece() {}  

void draw()   

};  

view plain

//棋子顏色

enum piececolor ;  

//棋子位置

struct piecepos  

};  

//棋子定義

class piece  

~piece() {}  

virtual

void draw() {}  

};  

class blackpiece: public piece  

~blackpiece() {}  

void draw()   

};  

class whitepiece: public piece  

~whitepiece() {}  

void draw()   

};  

相應棋盤的定義為:

view plain

copy to clipboard

class pieceboard  

~pieceboard()   

void setpiece(piececolor color, piecepos pos)  

else

m_vecpos.push_back(pos);  

}  };  

view plain

class pieceboard  

~pieceboard()   

void setpiece(piececolor color, piecepos pos)  

else

m_vecpos.push_back(pos);  

}  };  

客戶的使用方式一樣,這裡不重複給出,現在給出享元模式的uml圖,以圍棋為例。棋盤中含兩個共享的物件,黑棋子和白棋子,所有棋子的外在屬性都存放在單獨的容器中。

設計模式C 實現(9) 享元模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...

設計模式C 實現(9) 享元模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...

設計模式C 實現(9) 享元模式

軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了物件導向程式設計語言的重要特性 封裝 繼承 多型,真正領悟設計模式的精髓是可能乙個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用c 寫了個小例子,加深一下理解。主要參考 大話設計模式 和 設...