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;
}

运行结果:

posted @ 2017-04-28 21:35  弗莱曼飞侠  阅读(398)  评论(0编辑  收藏  举报