代理模式和装饰器模式(C++语法)

第一次接触代理模式是在插件化的工作中,组长给我写了个代理模式的demo让我仿照着这个样子写,目的是为了隐藏具体类的实现。第一次看到这个模式的时候是很震惊的,于是便请教了此设计模式的名字。
代理模式可分为聚合和继承两种,在这次的工作中我都是通过聚合来实现的,故本次的博客也会采用这种实现方式,而且在我看来聚合比继承来得更加干净,阅读起来也更加方便。先贴上一张代理模式得uml图(代码与图略有差异)
在这里插入图片描述
在java中有implements和entends两种,通过对java的代码解读,此图表示的为代理类Proxy和具体类RealSubject均继承与抽象类Subject,并且在代理类和具体类中建立起练习。在我以下的代码中主要体现了代理和实现类的关系、

#include "iostream"
using namespace std;
//聚合和继承
//英雄抽象类
class CHero
{
public:
	virtual void Attack() = 0;
	virtual void Dance() = 0;
};
class CAShe :public CHero
{
public:
	virtual void Attack()
	{
		cout << "Ashe 施放技能万箭齐发" << endl;
	}
	virtual void Dance()
	{
		cout << "Ashe ctrl+3" << endl;
	}
};
class CProAShe
{
public:
	CProAShe(shared_ptr<CAShe> ptr) :m_ptr(ptr){}//初始化列表
	shared_ptr<CAShe> GetPtr()
	{
		return m_ptr;
	}
	 void Attack()
	{
		 m_ptr->Attack();
	}
	 void Dance()
	{
		 m_ptr->Dance();
	}
private:
	//CHero* m_ptr;
	shared_ptr<CAShe> m_ptr;
};
int main()
{
	shared_ptr<CAShe> ashe_ptr(new CAShe());
	CProAShe obj(ashe_ptr);
	obj.Attack();
	obj.Dance();
	cout << "Hello" << endl;
	getchar();
}

以上代码便是代理模式的简单实现,这里将AShe类的一个共享指针作为代理类的成员变量,通过此成员变量调用AShe类的所有实现,使得避免了AShe的暴露(见《Effectice C++》 将文件间的编译依存关系降至最低),而且由于指针的大小在确定的操作系统下是固定的,使得此模块甚至可以在AShe仅声明未实现的情况下编译通过!当然其中的参数化列表也略有讲究(见effective c++)

在介绍装饰器模式前先来谈谈我对两种模式的理解,其实在网上查了很多东西,发现这两种设计模式的实现代码有很大的重复率,所以在我看来,代理模式可以用于对client隐藏具体的实现类,一般需要将原有类的所有成员函数都通过代理来实现,而装饰器模式则为对具体类的某些函数进行扩充(两者都满足开闭原则)

class CASheDec
{
public:
	CASheDec(shared_ptr<CAShe> ptr) :m_ptr(ptr) {}//初始化列表
	shared_ptr<CAShe> GetPtr()
	{
		return m_ptr;
	}
	void Dance()
	{
		m_ptr->Dance();
		this->Skin();
	}
private:
//将用于装饰的函数声明为private,避免被外界单独调用
	void Skin()
	{
		cout << "Ashe 装备皮肤" << endl;
	}
private:
	//CHero* m_ptr;
	shared_ptr<CAShe> m_ptr;
};

int main()
{
	shared_ptr<CAShe> ashe_ptr(new CAShe());
	CASheDec obj(ashe_ptr);
	obj.Dance();
	cout << "Hello" << endl;
	getchar();
}

上述为CASheDec装饰类的实现,总体上与代理相似,实现在其中封装了私有成员函数用于装饰,并选择原来的实现类的部分成员函数进行调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值