gpt4 book ai didi

C++:应用复合模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:33 25 4
gpt4 key购买 nike

我正在尝试应用 Composite 模式,因此我需要创建一个 Leaf 类和一个 Composite 类,它们都继承自同一个 Component 类。为了让我的任何 组件执行它们的职责,它们需要从单个 Helper 对象请求帮助。我们有以下内容

struct Helper {

void provide_help();
};

struct Component {

Component(Helper* helper)
: m_helper(helper) {
}

virtual void operation() = 0;

// the call_for_help function will be used by subclasses of Component to implement Component::operation()

void call_for_help() {
m_helper->provide_help();
}

private:
Helper* m_helper;
};

这里有两个不同的 Leaf 子类:

struct Leaf1
: Component {

Leaf1(Helper* helper)
: Component(helper) {
}

void operation() override {
call_for_help();
operation1();
}

void operation1();
};

struct Leaf2
: Component {

Leaf2(Helper* helper)
: Component(helper) {
}

void operation() override {
call_for_help();
operation2();
}

void operation2();
};

到目前为止,还不错。现在 Composite 类让我很伤心。典型的实现如下

struct Composite
: Component {

Composite(Helper* helper)
: Component(helper) {
}

void operation() override {
for (auto el : m_children) el->operation();
}

private:
std::vector<Component*> m_children;
};

通过一个接一个地遍历 m_children 并在每个上调用 operation 本质上多次调用辅助函数,即使一次调用对所有子级都足够了。理想情况下,如果 m_childrenLeaf1Leaf2 组成,我希望 Composite 操作仅调用辅助函数一次,然后依次调用 Leaf1::operation1() 和 Leaf2::operation2()。有什么办法可以达到我的需要吗?欢迎替代设计。我希望我的问题是有道理的。提前致谢!

最佳答案

你想要一个多态操作,但你正在为方法添加更多的责任(调用助手)。最好将这两件事分开。

struct Component {
void call_operation(){
call_for_help();
operation();
}
virtual void operation() = 0;
void call_for_help();
};

从 leaf::operation() 中删除 call_for_help()(使 operation1、operation2 冗余、多态),其余的应该可以正常工作。

您甚至可以从您的公共(public)界面隐藏 operation(),在这种情况下您需要与您的 Composite 建立友元。

关于C++:应用复合模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32019655/

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