享元模式

围棋

设计一个围棋软件,在系统中只存在一个白棋对象和一个黑棋对象,但是它们可以在棋盘的不同位置显示多次。

实验要求:

#include <iostream>

#include <map>

#include <vector>

using namespace std;

 

typedef struct Coordinates{

    int x;

    int y;

 

    Coordinates(){}

    Coordinates(int a, int b){x=a;y=b;}

 

    bool operator <(const Coordinates& other) const{

        if (x<other.x) return true;

        else if (x==other.x) return y<other.y;

        return false;

    }

}POINT;

 

typedef enum PieceColorTag{

    BLACK,

    WHITE

}PIECECOLOR;

 

class CPiece{

public:

    CPiece(PIECECOLOR color) : m_color(color){}

    PIECECOLOR GetColor() { return m_color; }

    void SetPoint(POINT point) { m_point = point; }

    POINT GetPoint() { return m_point; }

 

protected:

    PIECECOLOR m_color;

    POINT m_point;

};

 

class CGomoku : public CPiece{

public:

    CGomoku(PIECECOLOR color) : CPiece(color){}

};

 

class IgoChessmanFactory{

public:

    CPiece *GetPiece(PIECECOLOR color){

        CPiece *pPiece = NULL;

    if (m_vecPiece.empty()){

        pPiece = new CGomoku(color);

        m_vecPiece.push_back(pPiece);

    }

    else{

        for (vector<CPiece *>::iterator it = m_vecPiece.begin(); it != m_vecPiece.end(); ++it){

            if ((*it)->GetColor() == color){

                pPiece = *it;

                break;

            }

        }

        if (pPiece == NULL){

            pPiece = new CGomoku(color);

            m_vecPiece.push_back(pPiece);

        }

     }

        return pPiece;

    }

 

    ~IgoChessmanFactory(){

        for (vector<CPiece *>::iterator it = m_vecPiece.begin(); it != m_vecPiece.end(); ++it){

            if (*it != NULL){

                delete *it;

                *it = NULL;

            }

        }

    }

 

private:

    vector<CPiece *> m_vecPiece;

};

 

class IgoChessman{

public:

    void Draw(CPiece *piece){

        if (piece->GetColor()){

            cout<<"白色棋子位置:"<<piece->GetPoint().x<<","<<piece->GetPoint().y<<endl;

        }

        else{

            cout<<"黑色棋子位置:"<<piece->GetPoint().x<<","<<piece->GetPoint().y<<endl;

        }

        m_mapPieces.insert(pair<POINT, CPiece *>(piece->GetPoint(), piece));

    }

 

    void ShowAllPieces(){

        for (map<POINT, CPiece *>::iterator it = m_mapPieces.begin(); it != m_mapPieces.end(); ++it){

            if (it->second->GetColor()){

                cout<<"("<<it->first.x<<","<<it->first.y<<")白色棋子"<<endl;

            }

            else{

                cout<<"("<<it->first.x<<","<<it->first.y<<")黑色棋子"<<endl;

            }

        }

    }

 

private:

    map<POINT, CPiece *> m_mapPieces;

};

 

int main(){

    IgoChessmanFactory *pPieceFactory = new IgoChessmanFactory();

    IgoChessman *pCheseboard = new IgoChessman();

    CPiece *pPiece = pPieceFactory->GetPiece(WHITE);

    pPiece->SetPoint(POINT(1, 1));

    pCheseboard->Draw(pPiece);

    pPiece = pPieceFactory->GetPiece(BLACK);

    pPiece->SetPoint(POINT(3, 5));

    pCheseboard->Draw(pPiece);

    pPiece = pPieceFactory->GetPiece(WHITE);

    pPiece->SetPoint(POINT(2, 2));

    pCheseboard->Draw(pPiece);

    pPiece = pPieceFactory->GetPiece(BLACK);

    pPiece->SetPoint(POINT(1, 4));

    pCheseboard->Draw(pPiece);

}

posted @ 2024-11-16 12:30  涨涨涨张  阅读(3)  评论(0编辑  收藏  举报