• PROXY——代理模式


      代理,说白了就是中介。假设有俩对象A和B,A想访问B,但是根据迪米特法则,我们不能喝陌生人说话,简而言之就是A要减少知道B的相关情况,要降低A与B的耦合度。这时我们使用中介C,而C拥有B的相关情况,A通过C来访问B。

    下面我们使用一个案例来说明代理模式:

    类图:

    #include<iostream> 
    #include<string> 
    using namespace std;
    class Item {
    public:
        Item(string kind,bool fact) {
            this->kind = kind;
            this->fact = fact;
        }
        //物品类别 
        string kind;
        //是否真伪? 
        bool fact;
    };
    /*
       抽象一种购物方式,具有买功能。
        */
    class Shopping {
    public:
        virtual void buy(Item &item) = 0;
    };
    /*
       基于抽象类,实现一种具体的购物模式,去韩国购物
        */
    class KoreaShopping : public Shopping {
    public:
        virtual void buy(Item &item) {
            cout<<"去韩国进行了购物,买了"<<item.kind<<endl;
        }
    };
    /*
       基于抽象类,实现⼀一种具体的购物模式,去美国购物
        */
    class USAShopping : public Shopping {
    public:
        virtual void buy(Item &item) {
            cout << "去美国进行了购物,买了"<< item.kind << endl;
        }
    };
    /*
       基于抽象类,实现一种具体的购物模式,去非洲购物
        */
    class AfrikaShopping : public Shopping{
    public:
        virtual void buy(Item &item) {
            cout << "去非洲进行了购物,买了" << item.kind << endl;
        }
    };
    /*
       有一个海外代购代理,同样实现了购物模式,
          而且增加了办理护照和货物海关安检等具体业务。
           */
    class OverseasProxy :public Shopping {
    public:
        OverseasProxy(Shopping* shopping) {
            this->shopMode = shopping;
        }
        ~OverseasProxy() {
            delete this->shopMode;
        }
        //调用真实购物模式  
        virtual void buy(Item &item) {
            if (distinguish(item) == true) {
                this->shopMode->buy(item);
                check(item);
            }
            else {
                cout << "发现[" << item.kind << "],不能购买" << endl;
            }
        }
        //辨别物品真伪 
        bool distinguish(Item &item) {
            cout << "对物品[" << item.kind << "]辨别真伪." << endl;
            return item.fact;
        }
        //海关安检 
        void check(Item &item) {
            cout << "通过海关安检,带回国内" << endl;
        }
    private:
        Shopping * shopMode;
    };
    int main(void)
    {
        //  有几种类型的物品 
        Item t1("化妆品", true);
        Item t2("飞机", true);
        Item t3("狮子", false);
        Shopping *shopping = NULL;
        OverseasProxy *proxy = NULL;
        //现在想要买这几种物品 
        //1.  去韩国买化妆品 
        proxy = new OverseasProxy(new KoreaShopping);
        proxy->buy(t1);
        delete proxy;
        //2. 去美国买飞机 
        proxy = new OverseasProxy(new USAShopping);
        proxy->buy(t2);
        delete proxy;
        //3  去非洲买狮子 
        proxy = new OverseasProxy(new AfrikaShopping);
        proxy->buy(t3);
        delete proxy;
        return 0;
    }

    运行结果:

  • 相关阅读:
    【24点游戏】cocos2dx 源码
    『Python题库
    『Python题库
    【python安装】Windows上安装和创建python开发环境
    『Linux基础
    『Linux基础
    『Linux基础
    『Linux基础
    『Linux基础
    『Python基础-14』匿名函数 `lambda`
  • 原文地址:https://www.cnblogs.com/Burgess-Fan/p/6783411.html
Copyright © 2020-2023  润新知