//棋子颜色 enum PieceColor {BLACK, WHITE}; //棋子位置 struct PiecePos { int x; int y; PiecePos(int a, int b): x(a), y(b) {} }; //棋子定义 class Piece { protected: PieceColor m_color; //颜色 PiecePos m_pos; //位置 public: Piece(PieceColor color, PiecePos pos): m_color(color), m_pos(pos) {} ~Piece() {} virtual void Draw() {} }; class BlackPiece: public Piece { public: BlackPiece(PieceColor color, PiecePos pos): Piece(color, pos) {} ~BlackPiece() {} void Draw() { cout<<"绘制一颗黑棋"<<endl;} }; class WhitePiece: public Piece { public: WhitePiece(PieceColor color, PiecePos pos): Piece(color, pos) {} ~WhitePiece() {} void Draw() { cout<<"绘制一颗白棋"<<endl;} }; //棋盘的定义: class PieceBoard { private: vector<Piece*> m_vecPiece; //棋盘上已有的棋子 string m_blackName; //黑方名称 string m_whiteName; //白方名称 public: PieceBoard(string black, string white): m_blackName(black), m_whiteName(white){} ~PieceBoard() { Clear(); } void SetPiece(PieceColor color, PiecePos pos) //一步棋,在棋盘上放一颗棋子 { Piece * piece = NULL; if(color == BLACK) //黑方下的 { piece = new BlackPiece(color, pos); //获取一颗黑棋 cout<<m_blackName<<"在位置("<<pos.x<<','<<pos.y<<")"; piece->Draw(); //在棋盘上绘制出棋子 } else { piece = new WhitePiece(color, pos); cout<<m_whiteName<<"在位置("<<pos.x<<','<<pos.y<<")"; piece->Draw(); } m_vecPiece.push_back(piece); //加入容器中 } void Clear() //释放内存 { int size = m_vecPiece.size(); for(int i = 0; i < size; i++) delete m_vecPiece[i]; } };
int main() { PieceBoard pieceBoard("A","B"); pieceBoard.SetPiece(BLACK, PiecePos(4, 4)); pieceBoard.SetPiece(WHITE, PiecePos(4, 16)); pieceBoard.SetPiece(BLACK, PiecePos(16, 4)); pieceBoard.SetPiece(WHITE, PiecePos(16, 16)); }
//棋子颜色 enum PieceColor {BLACK, WHITE}; //棋子位置 struct PiecePos { int x; int y; PiecePos(int a, int b): x(a), y(b) {} }; //棋子定义 class Piece { protected: PieceColor m_color; //颜色 public: Piece(PieceColor color): m_color(color) {} ~Piece() {} virtual void Draw() {} }; class BlackPiece: public Piece { public: BlackPiece(PieceColor color): Piece(color) {} ~BlackPiece() {} void Draw() { cout<<"绘制一颗黑棋\n"; } }; class WhitePiece: public Piece { public: WhitePiece(PieceColor color): Piece(color) {} ~WhitePiece() {} void Draw() { cout<<"绘制一颗白棋\n";} }; 相应棋盘的定义为: [cpp] view plaincopyprint? class PieceBoard { private: vector<PiecePos> m_vecPos; //存放棋子的位置 Piece *m_blackPiece; //黑棋棋子 Piece *m_whitePiece; //白棋棋子 string m_blackName; string m_whiteName; public: PieceBoard(string black, string white): m_blackName(black), m_whiteName(white) { m_blackPiece = NULL; m_whitePiece = NULL; } ~PieceBoard() { delete m_blackPiece; delete m_whitePiece;} void SetPiece(PieceColor color, PiecePos pos) { if(color == BLACK) { if(m_blackPiece == NULL) //只有一颗黑棋 m_blackPiece = new BlackPiece(color); cout<<m_blackName<<"在位置("<<pos.x<<','<<pos.y<<")"; m_blackPiece->Draw(); } else { if(m_whitePiece == NULL) m_whitePiece = new WhitePiece(color); cout<<m_whiteName<<"在位置("<<pos.x<<','<<pos.y<<")"; m_whitePiece->Draw(); } m_vecPos.push_back(pos); } };
客户的使用方式一样,这里不重复给出,现在给出享元模式的UML图,以围棋为例。棋盘中含两个共享的对象,黑棋子和白棋子,所有棋子的外在属性都存放在单独的容器中。