代理模式:为对象提供一个代理对象以更好的控制和修改程序员对这个对象的访问与使用。
代理模式的运用极其广泛,最常见的作用:
1.需要使用外部提供的接口。
例如stl,或者动态库API函数等,其提供的接口函数有可能会发生改变,直接使用它们会使这些外部函数与项目工程有巨量的耦合,如果某个函数对象发生了改变(比如改了个名),就会导致在已有项目中使用到了这个接口函数的耦合需要全部被修改使程序员工作量陡增,解决这个问题的方法,就是用在项目中用一个类作为代理类封装这个外部接口,将耦合控制在这一个类中,用代理类管理外部接口函数的所有功能并与项目耦合,这样,当外部接口函数有变化时,只需要修改其代理类中与外部函数的耦合就可,无需在项目中寻找修改外部函数的耦合。
合作编码约束:
普通代理模式中的编码约束问题尽量通过团队内编码规范约束,因为每个主题类都是可维护和重用的,用技术上约束对系统维护相当不利。
代理模式优点:
职责清晰:被代理者干自己的事,代理者控制和协调其干活。
高扩展性和稳定性:
具体角色会变,但只要实现了接口函数,其代理类就无需修改,原样使用
例如:项目中需要用到stl中的queue,我们就可以创建一个为queue创建一个代理类,名叫ProQueue,封装需要用到queue的push()和pop()函数,便可以在项目中使用ProQueue代替queue而减少queue与项目的耦合,c++代码如下:
templateclass ProQueue { public: void push(Type TypeInput) { mQueue.push(TypeInput) } void pop() { mQueue.pop(); } private: queue mQueue; };
2.实现的工作类除了工作函数外还有:准备与后续
例如:
攻击函数除了给人造成伤害,还有动作前摇和动作后摇;
升级函数除了等级增加,还有礼包和成就解锁等其他工作;
c++代码如下:
class Player
{
public:
virtual void upgrade() = 0;
virtual void attack() = 0;
virtual void login() = 0;
protected:
string mName;
};
class RealPlayer: public Player
{
public:
RealPlayer(string& _name)
{
mName = _name;
}
void upgrade()
{
cout << mName << "升级了↑" << endl;
}
void attack()
{
cout << mName << "打怪中" << endl;
}
void login()
{
cout << mName << "登陆游戏" << endl;
}
};
class PlayerProxy: public Player
{
public:
PlayerProxy(Player * _Player)
{
mPlayer = _Player;
}
virtual void upgrade()
{
//一些前置条件,比如升级大礼包
cout << "升级大礼包" << endl;
mPlayer->upgrade();
//一些后置条件,比如成就奖励
cout << "解锁新成就啦" << endl;
}
virtual void attack()
{
//一些前置条件,比如攻击前摇
cout << "攻击前摇" << endl;
mPlayer->attack();
//一些后置条件,比如攻击后摇
cout << "攻击后摇" << endl;
}
virtual void login()
{
一些前置条件,比如弹出登陆框的动作
cout << "登陆框初始化" << endl;
mPlayer->login();
//一些后置条件,比如转圈圈小图标
cout << "登陆框转圈完毕进入游戏" << endl;
}
};
将功能类和代理类继承同一个基类:
通过代理调用功能类,所以代理中必须有功能类的各个功能函数(相同函数),代理为了更好的管理功能类的使用需要做更多的事(多态),而从一个共有基类中继承满足了函数名相同并多态的需求。
普通代理:使用时,创建一个功能类,用功能类做参数初始化代理类,通过代理类调用功能类函数
强制代理:使用时,创建一个功能类,给功能类一个函数,让功能类构造、初始化和返回一个代理类,通过返回的代理调用功能类函数。
强制代理示例:
class Player
{
public:
virtual void upgrade() = 0;
virtual void attack() = 0;
virtual void login() = 0;
protected:
string mName;
};
class PlayerProxy : public Player//这里要先声明和实现代理类,因为功能类中为了自己能生成一个代理类需要调用代理类的声明和构造函数。
{
public:
PlayerProxy(Player* _Player)
{
mPlayer = _Player;
}
virtual void upgrade()
{
//一些前置条件,比如升级大礼包
cout << "升级大礼包" << endl;
mPlayer->upgrade();
//一些后置条件,比如成就奖励
cout << "解锁新成就啦" << endl;
}
virtual void attack()
{
//一些前置条件,比如攻击前摇
cout << "攻击前摇" << endl;
mPlayer->attack();
//一些后置条件,比如攻击后摇
cout << "攻击后摇" << endl;
}
virtual void login()
{
一些前置条件,比如弹出登陆框的动作
cout << "登陆框初始化" << endl;
mPlayer->login();
//一些后置条件,比如转圈圈小图标
cout << "登陆框转圈完毕进入游戏" << endl;
}
protected:
Player* mPlayer;
};
class RealPlayer : public Player
{
public:
RealPlayer(string& _name)
{
mName = _name;
}
void upgrade()
{
cout << mName << "升级了↑" << endl;
}
void attack()
{
cout << mName << "打怪中" << endl;
}
void login()
{
cout << mName << "登陆游戏" << endl;
}
Player* GetDroxy()
{
mDroxy = new PlayerProxy(this);
return mDroxy;
}
protected:
Player* mDroxy;
};
void func()
{
string name1("zhangsan");
RealPlayer* Player1 = new RealPlayer(name1);
Player* PlayerProxy1 = Player1->GetDroxy();
PlayerProxy1->login();
PlayerProxy1->attack();
PlayerProxy1->upgrade();
}
关于Java提供的动态代理API,尚未了解如何用c++实现,以后搞出来了再发…



