Gof23种设计模式+简单工厂设计模式总结(二)

一、结构型设计模式

代理模式

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、优缺点及适用场景
优点:

能够协调调用者与被调用者,在一定程度上来说可以降低耦合性。
添加功能时通过添加代码实现,不用去修改源代码,符合开闭原则,系统有较好的扩展性

缺点

代理实现比较复杂

适用场景

为其他对象提供一种代理以控制这个对象的访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Web3_社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值