组合模式 Composite[通俗易懂]

组合模式 Composite[通俗易懂]组合模式 Composite动机模式定义实例结构要点总结笔记动机在软件某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象内部实现结构(而非抽象接口)地变化将引起客户代码地频繁变化.带来代码地维护性,扩展性等弊端如何将”客户代码与复杂地对象容器结构”解耦?让对象容器自己来实现自身地复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂地对象容器模式定义将对象组合成树形结构以表示”整体-部分”地层次结构.Composite使得用户对单个对象和组合对象地使用具有一致性(稳定)实例树形

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

在软件某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象内部实现结构(而非抽象接口)地变化将引起客户代码地频繁变化.带来代码地维护性,扩展性等弊端

如何将”客户代码与复杂地对象容器结构”解耦?让对象容器自己来实现自身地复杂结构,从而使得客户代码就像处理简单对象一样来处理复杂地对象容器

模式定义

将对象组合成树形结构以表示”整体-部分”地层次结构.Composite使得用户对单个对象和组合对象地使用具有一致性(稳定)

实例

树形访问

#include<algorithm>
using namespace std;
class Component{ 

public:
virtual void process() = 0;
virtual ~Component(){ 
}
}
class Composite : public Component{ 

string name;
List<Component *> elements;
public:
Composite(const string &s) : name(s){ 
}
void add(Component *element){ 

elements.push_back(element);
}
void remove(Component* element){ 

elements.remove(element);
}
void process(){ 

//process current node
//process current nodes
for (auto &e : elements){ 

e->process();
}
}
}
class leaf : public Component{ 

string name;
public:
Leaf(string s) : name(s){ 
}
void process(){ 

//process current node
}
}
void Invoke(Component &c){ 

//...
c.process();
//...
}
int main(){ 

Composite root("root");
Composite treeNode1("treeNode1");
Composite treeNode1("treeNode2");
Composite treeNode1("treeNode3");
Composite treeNode1("treeNode4");
Leaf left1("leaf1");
Leaf left2("leaf2");
root.add(&treeNode1);
treeNode1.add(&treeNode2);
treeNode2.add(&leaf1);
root.add(&treeNode3);   //具有一致性
treeNode3.add(&treeNode4);//具有一致性
treeNode4.add(&left2);//具有一致性
process(root);
}
int main(){ 

return 0;
}

结构

在这里插入图片描述

要点总结

  • Composite 模式采用树形结构来实现普遍存在地对象容器,从而将”一对多”地关系转化为”一对一”地关系,使得客户代码可以一致地(复用)处理对象和对象容器,无需关心处理地是单个地对象.还是组合地对象容器.
  • 将”客户代码与复杂地对象容器结构”解耦是Composite地核心思想,解耦之后.客户代码将与纯粹地抽象接口–而非对象容器地内容实现结构—发生依赖,从而更能”应对变化”
  • Compoiste模式在具体实现中,可以让父对象中地子对象反向追溯 如果父对象有频繁地遍历需求,可使用缓存技巧来改善效率

笔记

  • 一致性指的是对待整体和对待单个 是一样地
  • 访问地时候把树形结构地访问封装在了内部 而不是暴漏在外部
  • add 和 remove函数地放置位置有争议
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169032.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号