结构化对象的高性能装饰器模式

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! :)

我的目标是动态地扩展hugeVectorInitialFunctionality 对象的功能,同时尽可能降低对性能的影响,比如说:

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 在我的问题中的成员。请仔细阅读。另外,在添加虚拟方法时,您关于存储的说法也不正确。

以上是关于结构化对象的高性能装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章

装饰器模式

设计模式之简单理解装饰器模式与运用

设计模式——装饰器模式

PHP设计模式——装饰器模式

java设计模式之装饰器模式

结构型模式-装饰器模式