在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1定义将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性 2类图角色分析 Component抽象构建角色 定义参加组合独享的共同方法和属性,可以定义一些默认的行为或者属性 Leaf叶子结构,旗下没有分支,是最小的遍历单位 Composite树枝结构,作用是组合树枝节点和叶子结点形成的树形结构 3实现class Component { protected: Component(); public: virtual ~Component() = 0; //所有结点都有的共同信息 virtual void doSomething() = 0; }; //树枝结构 class Composite :public Component { private: list<Component> _comList = new list<Component>(); public: //增加一个叶子构建或者树枝构建 void add(Component &Com) { _comList.push_back(Com); } void remove(Component &com) { _comList.remove(com); } list<Component> getChildren() { return _comList; } }; //树叶结构 class Leaf:public Component { public: //覆盖父类方法 void doSomething() {} }; void display(Composite root) { //遍历root的孩子, 如果是叶子:打印 else 递归 } void Test { Composite *root = new Composite(); root->doSomething(); composite *branch = new Composite(); Leaf* leaf = new Leaf(); root->add(branch); root->add(leaf); } 4应用①优点 高层模块调用简单,所有结点都是Component ,局部和整体对调用者来说没有任何区别,高层不必关心自己处理的是单个对象还是整个组合结构 结点自由增加,使用组合模式,如果想增加树枝节点,树叶结点都很容易,只要找到父节点就行,符合开闭原则 ②缺点 树枝和树叶结点使用时的定义,直接使用的是实现类。违背依赖倒置原则 ③使用场景 维护和展示一部分-整体关系的场景:eg树形菜单,文件和文件夹管理 从一个整体中能够独立出部分模块和功能的场景 ④注意事项 只要是树形结构,就考虑组合模式,只要体现这你部分关系,就使用组合模式 5扩展①项目中常用的一种:由文件中的职员表项简历数据结构。能够通过for和递归直接创建结构 ②组合模式: a安全模式-如上 b透明模式-把用来组合使用的方法放在抽象类中,eg:add,remove,getChild 所以:叶子节点和树枝节点都继承得到以上方法,只是叶子节点内部空实现,什么也不做。。这样做的好处是,客户端遍历直接多态化,不用类型转换。 6提升对于这个组合模式,可能存在随机访问的问题,那么 增加一个父指针,实现目标即可 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论