结构化对象的高性能装饰器模式
Posted
技术标签:
【中文标题】结构化对象的高性能装饰器模式【英文标题】:High-performance decorator pattern for structured objects 【发布时间】:2013-02-17 14:49:24 【问题描述】:假设我有一个大数据结构,比如说一个巨大的vector
,它的创建不在我的控制之下(即我不能修改它的静态类型),包含类InitialFunctionality
的对象。在 C++ 中:
class InitialFunctionality
public:
void iCanDoThis();
hugeVector vector<InitialFunctionality>; // <- lots of elements inside! :)
我的目标是动态地扩展hugeVector
中InitialFunctionality
对象的功能,同时尽可能降低对性能的影响,比如说:
class ExtraFunctionality: public InitialFunctionality
public:
int iOfferThisToo;
众所周知的Decorator pattern 非常适用于非结构化对象。您可以使用它从InitialFunctionality
类中动态扩展对象的功能,然后愉快地传递它们。
但是如何在不改变其顺序且对性能影响最小的情况下扩展hugeVector
中的对象呢?例如,由于它的大小,复制向量是不行的。
我正在考虑对向量使用某种Adapter,它保留对原始hugeVector
的引用,并根据需要懒惰地转换包含的对象(即在访问适应的向量元素时)。然而,除了转换本身(即初始化iOfferThisToo
),这是任何方法都需要的,这需要保留一个缓存来检查一个对象是否已经被转换。这样的缓存可能真的很昂贵。
【问题讨论】:
InitialFunctionality
在你的控制之下吗?
@AndyProwl 假设您的意思是InitialFunctionality
的定义:不,它不在我的控制之下。否则我可以在那里添加我的额外功能。这在设计方面可能被认为是丑陋的,但在性能方面会很好,这正是我所寻找的。span>
【参考方案1】:
如果您不添加额外的成员,您应该可以执行以下操作:
class myInternalFunctionality : public InternalFunctionality
public:
//new features
void ICanDoThis();
private:
// disable all ctors
;
然后重铸指向向量中 InternalFunctionality 的指针。
myInternalFunctionality* myInternalPtr = &hugeVector[i];
myInternalPtr->ICanDoThis();
既然你是,我想你遇到了一些麻烦。
【讨论】:
您能详细说明一下吗?对于初学者,我看不到InternalFunctionality
如何添加我的额外数据成员iOfferThisToo
。假设没有隐含额外的转换,您的解决方案根本不正确(而且很危险!),因为没有分配给存在于myInternalFunctionality
中且不存在于InternalFunctionality
中的额外成员
我没说这是个好主意,你也没说有额外的成员。类的存储基本上与结构相同,因此如果您想简单地添加方法,则可以使用。
我确实说过有额外的成员,iOfferThisToo
是在我的问题中的成员。请仔细阅读。另外,在添加虚拟方法时,您关于存储的说法也不正确。以上是关于结构化对象的高性能装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章