组合模式适用于树形结构的递归操作,通过Component、Leaf和Composite三类实现;为支持访问控制,可引入角色权限机制,在add/remove等操作中校验权限,如SecureComposite根据Role判断是否允许修改;为进一步解耦,可用装饰器模式(如AuthorizedComposite)将权限验证与业务逻辑分离,提升灵活性与可维护性。

在C++中,组合模式(Composite Pattern)常用于表示树形结构,比如文件系统、UI组件或组织架构。当需要对这类结构进行递归操作时,通常会结合访问控制机制来限制某些操作的权限,例如只允许特定角色创建或删除节点。
组合模式包含三个核心角色:
示例代码片段:
class Component {
public:
virtual ~Component() = default;
virtual void add(Component*) { /* 可选实现 */ }
virtual void remove(Component*) { /* 可选实现 */ }
virtual void operation() const = 0;
};
<p>class Leaf : public Component {
public:
void operation() const override {
std::cout << "Leaf operation\n";
}
};</p><p>class Composite : public Component {
private:
std::vector<Component<em>> children;
public:
void add(Component</em> c) override {
children.push_back(c);
}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">void remove(Component* c) override {
children.erase(
std::remove(children.begin(), children.end(), c),
children.end()
);
}
void operation() const override {
for (const auto& child : children) {
child->operation();
}
}};
立即学习“C++免费学习笔记(深入)”;
在真实场景中,并非所有用户都能自由修改结构。可以通过引入权限标记或上下文信息,在关键操作前进行检查。
一种方式是将访问逻辑封装在方法内部,根据调用者的角色决定是否执行操作:
扩展Composite类以支持访问控制:
enum class Role { GUEST, USER, ADMIN };
<p>class SecureComposite : public Component {
private:
std::vector<Component*> children;
Role role;</p><p>public:
explicit SecureComposite(Role r) : role(r) {}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">void add(Component* c) override {
if (role != Role::ADMIN) {
throw std::runtime_error("Access denied: only admin can add");
}
children.push_back(c);
}
void remove(Component* c) override {
if (role != Role::ADMIN) {
throw std::runtime_error("Access denied: only admin can remove");
}
// 删除逻辑...
}
void operation() const override {
for (const auto& child : children) {
child->operation();
}
}};
立即学习“C++免费学习笔记(深入)”;
若将权限判断直接写入业务类,可能导致职责混杂。更清晰的做法是引入策略模式或装饰器模式解耦验证逻辑。
例如,使用装饰器包装Composite对象:
class AuthorizedComposite : public Component {
private:
Composite* wrapped;
Role requiredRole;
Role userRole;
<p>public:
AuthorizedComposite(Composite* w, Role req, Role usr)
: wrapped(w), requiredRole(req), userRole(usr) {}</p><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">void add(Component* c) override {
if (userRole >= requiredRole) {
wrapped->add(c);
} else {
throw std::runtime_error("Insufficient privileges");
}
}
void operation() const override {
wrapped->operation();
}};
立即学习“C++免费学习笔记(深入)”;
这种方式让原始类保持简洁,权限控制成为可插拔模块,便于测试和复用。
组合模式天然适合递归操作,但在多用户或多权限场景下,需谨慎处理修改行为。通过在关键方法中嵌入访问检查,或利用装饰器隔离安全逻辑,可以有效实现受控的树结构管理。关键是避免将权限硬编码进数据结构本身,保持设计的灵活性和可维护性。
基本上就这些。
以上就是C++组合模式递归操作与访问控制结合的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号