1. 代理模式的定义和类图
从代理模式开始进入结构型模式的学习阶段,而结构模式的宗旨是让类与类进行组合,获取各大的结构。而代理模式属于其中最典型的一种,具体来说,代理类与被代理类都是为了实现某个对象,但是代理类可以在代理类的功能实现过程中(前后)进行一些处理工作。其具体的结构形式如其类图所示:
根据代理模式的类图课件,代理类与被代理类都是为了实现同样的一个功能Request,而被代理类实现的功能为其基本实现,代理类则可以在类中调用被代理类,在其实现的前后(即过程中)进行一些额外操作。由此,当被代理类的基本功能确定后,可以通过多个代理类来实现对其基本功能的拓展。
2. 代理模式的代码实现
#include <iostream>
#include <string>
using namespace std;
class Subject
{
public:
virtual void KillMonster() = 0;
};
class NormalPlayer : public Subject
{
public:
void KillMonster()
{
cout << "NormalPlayer Kill the Monster By 10 Damage" << endl;
}
};
class ProxyPlayer : public Subject
{
public:
ProxyPlayer(Subject* player)
{
m_normalplayer = player;
}
void ReduceMonsterArmor()
{
cout << "ProxyPlayer Reduce the Monster's Armor" << endl;
}
void KillMonster1sec()
{
cout << "ProxyPlayer Kill the Monster in 1 sec" << endl;
}
void KillMonster()
{
m_normalplayer = new NormalPlayer;
ReduceMonsterArmor();
m_normalplayer->KillMonster(); //代理模式,即调用被代理对象实现基本功能,并在其实现前后添加多种功能
KillMonster1sec();
}
private:
Subject* m_normalplayer;
};
int main()
{
Subject* player = new NormalPlayer;
player->KillMonster();
Subject* proxyplayer = new ProxyPlayer(player);
proxyplayer->KillMonster();
delete player;
delete proxyplayer;
}
通过实现过程可以看出,代理类即在内部调用被代理类的基本功能实现函数,然后在其实现前后,或者实现过程中对其进行修饰加工之类的操作,则变成了被代理类的自身Request函数。