在项目开发中,经常会使用第三方库,包括外部封装或者是公司内部自己封装的类库。在使用这些类库的过程中,有时这些类库并不能全部满足我们的需求,需要我们在这些类库的基础之上进行扩展,以满足我们自己的需求,但是由于各种原因,这个类库的源码和维护人员已经不能找到了,需要自己在现有代码的基础之上进行开发,这就需要使用设计模式中的代理来实现新功能的扩展。
例如一个库中的新类,里面有创建各种设备的功能,但是现有的创建的设备没有满足我们需求的,于是我们自己创建了一个新的设备。继承自原来的设备类。
class DeviceEx :public Device{
//扩展功能
}
原来的创建类:
class DeviceCreatorPrivate {
public:
DeviceCreatorPrivate();
~DeviceCreatorPrivate();
public:
// 此方法创建的设备对象(new),需要外部进行释放
static Device* create(DeviceType type);
//其他代码
};
定义这个新的设备类型:
emnu DeviceType {
//已有的设备类型
...
DeviceType_New,//新创建的设备类型
}
现在就要新的封装新的创建类代理:
class DeviceCreatorPrivateProxy {
public:
DeviceCreatorPrivate();
~DeviceCreatorPrivate();
public:
// 此方法创建的设备对象(new),需要外部进行释放
static Device* create(DeviceType type);
//其他代码
};
Device* DeviceCreatorPrivateProxy::create(DeviceType type) {
if (type == DeviceType_New) {//单独创建新设备
return new DeviceEx ();
}
return DeviceCreatorPrivate::create(type);//其他设备的创建照旧
}
在实际应用中直接调用新类来创建设备就可以了,DeviceCreatorPrivateProxy::create
在原来的代码的基础上,不改变原来的代码就行再次封装实现新的功能,这就是代理的实现方式。
aaa