gpt4 book ai didi

c++ - 使用装饰器模式时,我可以在一个具体的装饰器对象中添加新的装饰器吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:51 25 4
gpt4 key购买 nike

例子:

class Display
{
public:
virtual void display() = 0;
};

class PageDisplay : public Display
{
public:
void display() { /* ... */ }
};

class DisplayDecorator : public Display
{
public:
DisplayDecorator(Display* display) : m_display(display) {}
virtual void display() { m_display->display(); }
private:
Display* m_display;
};

class BorderDecorator : public DisplayDecorator
{
public:
BorderDecorator(Display* display) : DisplayDecorator(display) {}
virtual void display() { DisplayDecorator::display(); /* do border stuff here ... */ }
};

int main()
{
Display* pageDisp = new BorderDecorator(new PageDisplay());
pageDisp->display();
}

所以,这是装饰器模式的一个相当初级的实现。但是,比方说,我想在 BorderDecorator 具体类中添加一个额外的装饰器。所以 BorderDecorator::display 函数现在看起来像这样:

virtual void display()
{
/*
I need to add a decorator that will display a slider bar at the side of the screen,
and that will wrap the PageDisplay decorator so that it will run before the page display.
Is there a clean way to get my base class' m_display pointer so that I can do something like this:
*/
m_display = new SliderDecorator(m_display);

DisplayDecorator::display();
/* do border stuff here ... */
}

我还知道,在这个示例中,我真的只想从客户端函数(在本例中为 main)中应用 SliderDecorator。我想不出一个很好的例子来说明为什么需要从具体的装饰器对象中添加额外的装饰器(除了我正在做的事情),但请耐心等待;我这样做有充分的理由。我也知道我可以使抽象装饰器对象(本例中的 m_display)中的抽象基类指针 protected 而不是私有(private),然后从具体装饰器对象中添加额外的装饰器,就像我在示例中所做的那样,但这看起来像这是一个坏主意,因为它破坏了数据封装,现在装饰器可能无法与它们装饰的对象进行不正确的交互。话虽如此,这是我唯一的选择吗?在具体装饰器的“装饰”函数中是否有更好的方法来用另一个装饰器包装复合装饰器,然后像往常一样继续?

最佳答案

事情是这样的。客户应该知道应用什么装饰器。将此逻辑推到装饰器内部没有意义,因为当客户端调用 BorderDecorator 时,它只需要一个边框而不是带有 slider 的边框。在客户端代码中,如果你想链接多个你需要能够动态指定的装饰器,你可以使用 Chain of Responsibility模式。

关于c++ - 使用装饰器模式时,我可以在一个具体的装饰器对象中添加新的装饰器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11253388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com