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; };