一、结构型设计模式
代理模式
1、代理模式概述
为其他对象提供代理一种以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
2、示例代码
#define _CRT_SECURE_NO_WARNING
#include <iostream>
#include <string>
using namespace std;
class Goods
{
public:
Goods(bool IsReal, string GoodsName) :m_iIsReal(IsReal), m_iGoodsName(GoodsName){}
bool getIsReal()
{
return m_iIsReal;
}
string getGoodsName()
{
return m_iGoodsName;
}
private:
bool m_iIsReal;
string m_iGoodsName;
};
class AbstractShopping
{
public:
virtual void BuyGoods(Goods*) = 0;
};
class KoreaShopping : public AbstractShopping
{
public:
virtual void BuyGoods(Goods* goods)
{
cout << "come to korea for shopping" << goods->getGoodsName() << endl;
}
};
class AmericanShopping : public AbstractShopping
{
public:
virtual void BuyGoods(Goods* goods)
{
cout << "come to American for shopping" << goods->getGoodsName() << endl;
}
};
class AfricaShopping : public AbstractShopping
{
public:
virtual void BuyGoods(Goods* goods)
{
cout << "come to Af for shopping" << goods->getGoodsName() << endl;
}
};
class OverSeaShopping : public AbstractShopping
{
public:
OverSeaShopping(AbstractShopping* smode)
{
m_iShopping = smode;
}
virtual void BuyGoods(Goods* goods)
{
if (!GoodsIsReal(goods))
{
CheckGoods();
m_iShopping->BuyGoods(goods);
}
else
{
cout << goods->getGoodsName() << "goods is not real" << endl;
}
delete goods;
}
bool GoodsIsReal(Goods *goods)
{
cout << "海外代检查" << goods->getGoodsName() << "是否真假" << endl;
return goods->getIsReal();
}
void CheckGoods()
{
cout << "海关代理检查" << endl;
}
~OverSeaShopping()
{
if (m_iShopping == NULL)
{
delete m_iShopping;
}
}
private:
AbstractShopping* m_iShopping;
};
int main()
{
AbstractShopping *as = NULL;
OverSeaShopping *os1 = new OverSeaShopping(new KoreaShopping());
os1->BuyGoods(new Goods(true, "aaa"));
delete os1;
OverSeaShopping *os2 = new OverSeaShopping(new AmericanShopping());
os2->BuyGoods(new Goods(false, "bbb"));
delete os2;
OverSeaShopping *os3 = new OverSeaShopping(new AfricaShopping());
os3->BuyGoods(new Goods(true, "ccc"));
delete os3;
delete as;
while (1){}
return 0;
}
3、优缺点及适用场景
优点:
能够协调调用者与被调用者,在一定程度上来说可以降低耦合性。
添加功能时通过添加代码实现,不用去修改源代码,符合开闭原则,系统有较好的扩展性
缺点
代理实现比较复杂
适用场景
为其他对象提供一种代理以控制这个对象的访问