0 代理模式和装饰模式
代理模式和装饰模式,类似。都是继承或是关联原有类,然后通过新类通过转发请求的同时添加额外的操作达到扩展、限制原有类。
1 代理模式
1.0 需求
当创建一个对象的代价很大, 而创建出的对象可能并不会被实际使用到。
或是,针对不同的权限,对象的某些接口可能不能被调用。
因此使用关联(组合)的方式使用一个类封装实际功能类:
- 当实际调用接口的时候,再去创建实际功能类的对象
- 当存在权限的时候,使用不同的类封装实际功能类的对象。
- 远程代理,将实际的功能转发给远程对象。
1.1 实现
/* 权限控制 */
// 员工类
class ABStaff
{
public:
// 拥有所有的权限,单都是虚函数
};
class Boss :public ABStaff
{
public:
// 不变,boss拥有所有全向
};
class xiaobing:public ABStaff
{
public:
// 重写某些小兵不应该具有的函数,达到权限控制
};
/* 延时创建 */
class Pic
{
// 创建开销很大的类
};
class Proxy
{
public:
Proxy(/*提供创建pic相关的信息*/);
void do();
private:
//所有的函数都包含create_pic(),先判断是否有pic,如果没有就先创建。
//当然也有函数可能不会用到,因此就不用调用该函数
void create_pic();
Pic *pic;
}
2 装饰模式
2.0 需求
已经有一个类了,但是需要再这个类的基础上扩展额外的功能,例如调用api前打个log。
或是对传入参数先预处理一下。
因此使用装饰这模式。
这个模式很简单,就是继承实际功能类对象,然后按照该对象的接口,重建同名,然后转发。
实现对类的功能拓展。
用继承的原因在于,能够复用原来类的代码。
2.1 实现
class MoreYellowBook:public AbBook
{
public:
MoreYellowBook(AbBook*b):_book(s);
//功能增强
MoreYello()
{
//这里可以放个函数
this->_book->part01();
//这里还可以放一个增强函数
}
//下面实现上面的虚函数。
virtual string part01()
{
_book->part01();//不建议在这里改变功能。
}
//省略代码
private:
AbBook _book;
};