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; }
运行结果: