餐馆那些事之:Proxy Pattern

1. 概述
Proxy Patter模式:通过对某个对象提供代理,从而控制&隔离对这个对象的访问。
类图:
餐馆那些事之:Proxy Pattern_第1张图片
Object:定义了Concrete_object和Proxy的公用接口,这样才能在需要使用Concrete_object的地方使用Proxy代替
Concrete_object:具体实现类
Proxy:Concrete_object的代理
Proxy Pattern常使用在:
1)通过Proxy类,实现对Concrete_object访问的权限控制
2)隔离client和Concrete_object
3)处理数据库、中间件及其它第三方接口

2. 实例
餐馆有普通用户和vip用户之分,对于vip用户,菜价8折。具体菜属于concrete_object,对菜价的控制通过proxy实现。
ok,let's go:

#include <iostream>  
#include <list>  
#include <algorithm>  
using namespace std;  

//Customer类,包括用户类别属性 
class Customer
{
public:
	Customer(int type)
	{
		_type = type;
	}
	
	int get_type()
	{
		return _type;
	}
private:
	int _type; //1为普通用户,2为VIP用户
};

//Object类
class Food
{  
public:  
    Food()  
    {  
    }  
  
    virtual ~Food()  
    {  
    }  
  
    virtual int price() = 0;

    virtual void set_customer(Customer*)
    {
    }
};  

//Concrete_object
class Chinese_food : public Food
{  
public:  
	Chinese_food(int price)
	{
		_price = price;
	}
	
	virtual ~Chinese_food()  
	{  
	}  
	
	virtual int price()  
	{  
		return _price; 
	}  
private:
    int _price;
};  

//代理类
class Proxy_CF : public Food
{  
public:  
    Proxy_CF()
    {  
        _cf = NULL;
        _customer = NULL;
    }  
  
    virtual ~Proxy_CF()  
    {
        if(_cf)
        {
         	delete _cf;
        }
    }  
  
    //根据用户的不同属性,给出具体的价格信息
    virtual int price()
    {  
        if(NULL == _cf)
        {
         		_cf = new Chinese_food(100);
        }

        switch(_customer->get_type())
        {
            case 1 :
                    return _cf->price();
                    break;

            case 2:
                    return (int)(0.8 * _cf->price());
                    break;

            default:
                    return _cf->price();
                    break;
        }

        return _cf->price();
    }  

    void set_customer(Customer* customer)
    {
            _customer = customer;
    }
private:
    Chinese_food* _cf;
    Customer* _customer;
};  
  
int main(int argc, char** argv)  
{  
  Food* proxy_cf = new Proxy_CF()
  Customer c_a(1);
  proxy_cf->set_customer(&c_a);
  cout << "food price:" << proxy_cf->price() << endl;

  Customer c_b(2);
  proxy_cf->set_customer(&c_b);
  cout << "food price:" << proxy_cf->price() << endl;

  if(proxy_cf)
  {
     delete proxy_cf;
  }
  return 0;  
}  


输出:
food price:100
food price:80

你可能感兴趣的:(餐馆那些事之:Proxy Pattern)