组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理
对象实现同一个接口,先访问代理类再访问真正要访问的对象。
代理模式分为静态代理、动态代理。
静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
#pragma once
#include "stdafx.h"class IKindWomen
{ public: IKindWomen(void) {} virtual ~IKindWomen(void) {} virtual void MakeEyesWithMan() = 0; virtual void HappyWithMan() = 0;};
#pragma once
#include "IStrategy.h"class CWangPo : public IKindWomen
{ public: CWangPo(IKindWomen *pKindWomen); ~CWangPo(); void HappyWithMan(); void MakeEyesWithMan();private: IKindWomen * m_pKindWomen;};
#include "StdAfx.h"
#include "oneWay.h"CWangPo::CWangPo(IKindWomen *pKindWomen)
{ this->m_pKindWomen = pKindWomen;}CWangPo::~CWangPo()
{ delete this->m_pKindWomen;}void CWangPo::HappyWithMan()
{ this->m_pKindWomen->HappyWithMan();}void CWangPo::MakeEyesWithMan(void)
{ this->m_pKindWomen->MakeEyesWithMan();}#pragma once
#include "IStrategy.h"class CPanJinLian:public IKindWomen
{ public: CPanJinLian(); ~CPanJinLian(); void HappyWithMan(); void MakeEyesWithMan();};
#include "StdAfx.h"
#include "TwoWay.h"#include <iostream>CPanJinLian::CPanJinLian()
{ }CPanJinLian::~CPanJinLian()
{ }void CPanJinLian::HappyWithMan()
{ std::cout << " 潘金莲和男人... ... " << std::endl;}void CPanJinLian::MakeEyesWithMan()
{ std::cout << " 潘金莲抛媚眼 " << std::endl;}
#pragma once
#include "IStrategy.h"class CJiaShi :public IKindWomen
{ public: CJiaShi(); ~CJiaShi(); void HappyWithMan(); void MakeEyesWithMan();};
#include "StdAfx.h"
#include "ThreeWay.h"#include <iostream>CJiaShi::CJiaShi()
{ }CJiaShi::~CJiaShi()
{ }void CJiaShi::HappyWithMan()
{ std::cout << " 贾氏和男人... ... " << std::endl;}void CJiaShi::MakeEyesWithMan()
{ std::cout << " 贾氏抛媚眼 " << std::endl;}
#include "stdafx.h"
#include "IStrategy.h"#include "OneWay.h"#include "TwoWay.h"#include "ThreeWay.h"#include <iostream> void DoPanJinLian(){ CWangPo *pWangPo; // 西门庆想找潘金莲,让王婆来安排。 pWangPo = new CWangPo(new CPanJinLian()); pWangPo->MakeEyesWithMan(); pWangPo->HappyWithMan(); delete pWangPo;}void DoJiaShi(){ CWangPo *pWangPo; // 西门庆想找贾氏,让王婆来安排。 pWangPo = new CWangPo(new CJiaShi()); pWangPo->MakeEyesWithMan(); pWangPo->HappyWithMan(); delete pWangPo;}int _tmain(int argc, _TCHAR* argv[])
{ // 西门庆想找潘金莲 DoPanJinLian();// 西门庆想找贾氏
DoJiaShi();system("pause");
return 0;}