您的位置:首页 > 编程语言 > C语言/C++

设置模式之代理模式(Proxy Pattern) (C++源代码)

2008-11-28 17:30 387 查看
代理模式将原来类的真实的操作从调用者的视野里移开,可能还增加了一些调用者觉察不到的操作,不过从类设计者的立场来看这些都不影响调用者使用原先类的功能,为了保护一个类而多生成一个新类,不敢说思想十分正确,至少感到拐了一个弯才实现自己的目的有些不爽。 可能代理模式真正发挥威力的地方是从此衍生的动态代理方法吧。

// ProxyParenter.cpp : Defines the entry point for the console application.
//

//代理模式是对象的结构模式,操作的目标主要是类对象
//下面是比较经典又精简的一个例子:

#include "stdafx.h"
#include <iostream>

using namespace std;

//抽象角色
class ISubject
{
public:
    ISubject()
    {
    }

    virtual ~ISubject()
    {
    }
public:
    virtual void Request() = 0;
};

//真实角色:实现了Subject的request()方法
class CSubject:public ISubject
{
public:
    CSubject()
    {
    }
    virtual ~CSubject()
    {
    }

public:
    virtual void Request()
    {
        cout << "CSubject::Request()" << endl;
    }
};

//代理角色
class CProxySubject:public ISubject
{
public:
    CProxySubject(int nId)
    {
        this->m_nId = nId;
    }

    virtual ~CProxySubject()
    {
    }

public:
    virtual void Request()
    {
        if (!this->PreRequest(this->m_nId))
        {
            cout << "request reject!" << endl;
            return;
        }

        this->m_objSub.Request();

        this->AfterRequest();
    }

    void SetId(int nId)
    {
        this->m_nId = nId;
    }

    int GetId()
    {
        return this->m_nId;
    }

private:
    bool PreRequest(int nId)
    {
        if ( (nId > 0) && (nId <= 100) )
        {
            return true;
        }

        return false;
    }

    void AfterRequest()
    {
        cout << "After Do Request!" << endl;
    }

private:
    CSubject    m_objSub;
    int         m_nId;
};

int main()
{
    ISubject* pObj = NULL;
    int nId = 0;

    cout << "please input your id:" << endl;
    cin >> nId;

    pObj = new CProxySubject(nId);
    
    if (NULL != pObj)
    {
        pObj->Request();
    }

    //clear
    if (NULL != pObj)
    {
        delete pObj;
        pObj = NULL;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: