设计模式观后(c++还原之九 代理模式)

代理模式就用两篇文章来吧!

代理模式之一


//代理模式
//对实体类进行代理,派生实体类,构造虚函数
//有透明和普通代理。透明代理:再代理一次代理类进行封装。
//下面看下强制代理代码(包含了上面的介绍)
class IGamePlayer {
	//强制代理的通用接口类
public:
	virtual void Login(string user, string password) {}
	virtual void KillBose() {}
	virtual void Upgrade() {}
	virtual IGamePlayer* GetProxy() {}
};
class GamePlayer : public IGamePlayer {
	//强制代理的真实角色
private:
	string m_name;
	IGamePlayer* m_pProxy;

public:
	GamePlayer(string _name) {
		m_name = _name;
	}
	IGamePlayer* GetProxy() {
		//重点在这,角色类会自动判断是否是自己的代理类
		//我的话会用枚举来判断是否是自己的强制代理类
		m_pProxy = new IGamePlayer;
		return m_pProxy;
	}
	//接下来的函数就通过指针判断代理类
	void KillBose() {
		if (IsProxy()) {
			cout << m_name << "kill bose";
		} else cout << "proxy not right";
	}
	void Login(string user, string password) {
		if (IsProxy()) {
			cout << m_name << "login";
		} else cout << "proxy not right";
	}
	void Upgrade() {
		if (IsProxy()) {
			cout << m_name << "upgrade";
		} else cout << "proxy not right";
	}

private:
	bool IsProxy() {
		if (m_pProxy) {
			return true;
		} else return false;
	}
};

class GamePlayerPoxy : public IGamePlayer {
private:
	IGamePlayer* m_pGamePlayer;
public:
	GamePlayerPoxy(IGamePlayer* _gameplayer) {
		m_pGamePlayer = _gameplayer;
	}
	void KillBose() {
		m_pGamePlayer->KillBose();
	}
	void Login(string user, string password) {
		m_pGamePlayer->Login(user, password);
	}
	void Upgrade() {
		m_pGamePlayer->Upgrade();
	}
	IGamePlayer* GetProxy() {
		return this;
	}
};
//场景限制
class Client {
	static void main() {
		IGamePlayer* player = new GamePlayer("demo");
		//在这里,实体类只能被指定的代理类所代理
		//如果是其他形式创建的类,调用就不会成功
		IGamePlayer* poxy = player->GetProxy();
		poxy->Login("demo", "123456");
		poxy->KillBose();
		poxy->Upgrade();
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值