桥接模式(Flyweight Pattern)
定义
运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。
常用场景
- 系统中存在大量的相似对象
- 细粒度的对象都具有较接近的外部状态,而内部状态和环境无关。
- 需要缓冲池的场景
优点
是一个简单的模式,可以大大减少程序创建的对象,降低内存占用,增强性能
缺点
提高系统复杂性,需要分离状态,且外部状态不应该随着内部状态的改变而改变
C++实现
举例:五子棋
一个棋盘上可以下很多五子棋,但五子棋只有黑白两种颜色,只是位置不同而已。这时就可以采用享元模式,共享五子棋,五子棋的颜色为内部状态,位置为外部状态。
类图:
代码:
#include <iostream>
#include <string>
#include <vector>
using std::cout;
using std::endl;
enum GmomokuColor
{
BLACK,
WHITE
};
struct GmomokuPos
{
int m_x;
int m_y;
GmomokuPos(int x, int y) : m_x(x), m_y(y) {}
};
// 五子棋类
class Gomoku
{
public:
Gomoku(GmomokuColor color) : m_color(color) {}
~Gomoku() {}
void Show()
{
if (m_color == BLACK)
std::cout<<"下一枚黑棋"<<std::endl;
else
std::cout<<"下一枚白棋"<<std::endl;
}
private:
GmomokuColor m_color;
};
class GomokuFactory
{
public:
GomokuFactory(): m_pBlackGomoku(nullptr), m_pWhiteGomoku(nullptr) {}
~GomokuFactory()
{
if (m_pBlackGomoku)
{
delete m_pBlackGomoku;
m_pBlackGomoku = nullptr;
}
if (m_pWhiteGomoku)
{
delete m_pWhiteGomoku;
m_pWhiteGomoku = nullptr;
}
m_blackGomokuPoss.clear();
m_whiteGomokuPoss.clear();
}
void SetGomoku(GmomokuColor color, GmomokuPos pos)
{
if (color == BLACK)
{
if (m_pBlackGomoku == nullptr)
m_pBlackGomoku = new Gomoku(BLACK);
m_blackGomokuPoss.push_back(pos);
std::cout<<"在("<<pos.m_x<<','<<pos.m_y<<")处";
m_pBlackGomoku->Show();
}
else
{
if (m_pWhiteGomoku == nullptr)
m_pWhiteGomoku = new Gomoku(WHITE);
m_whiteGomokuPoss.push_back(pos);
std::cout<<"在("<<pos.m_x<<','<<pos.m_y<<")处";
m_pWhiteGomoku->Show();
}
}
private:
Gomoku* m_pBlackGomoku; // 黑棋
Gomoku* m_pWhiteGomoku; // 白棋
std::vector<GmomokuPos> m_blackGomokuPoss;
std::vector<GmomokuPos> m_whiteGomokuPoss;
};
void FlyweightTest()
{
GomokuFactory* pGomokuFactory = new GomokuFactory;
pGomokuFactory->SetGomoku(BLACK, GmomokuPos(1, 2));
pGomokuFactory->SetGomoku(WHITE, GmomokuPos(2, 3));
pGomokuFactory->SetGomoku(BLACK, GmomokuPos(1, 1));
pGomokuFactory->SetGomoku(WHITE, GmomokuPos(3, 3));
pGomokuFactory->SetGomoku(BLACK, GmomokuPos(0, 2));
pGomokuFactory->SetGomoku(WHITE, GmomokuPos(2, 0));
delete pGomokuFactory;
pGomokuFactory = nullptr;
}