前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >组合模式(Composite)

组合模式(Composite)

作者头像
Java高级架构
发布2018-07-20 15:04:25
4120
发布2018-07-20 15:04:25
举报
文章被收录于专栏:JAVA高级架构JAVA高级架构

1. 定义

将对象组合成树形结构以表示”部分-整体”的层次结构,Composite模式使得用户对单个对象和组合对象的使用具有一致性。

2. UML建模图

Component(抽象构件接口)

  • 为组合的对象声明接口
  • 在某些情况下实现从此接口派生出的所有类共有的默认行为
  • 定义一个接口可以访问及管理它的多个子部件

Leaf(叶部件)

  • 在组合中表示叶节点对象,叶节点没有子节点
  • 定义组合中接口对象的行为

Composite(组合类)

  • 定义有子节点(子部件)的部件的行为
  • 存储子节点(子部件)
  • 在Component接口中实现与子部件相关的操作

Client(客户端)

  • 通过Component接口控制组合部件的对象

3. 实现代码:

代码语言:java
复制
// Component:public abstract class Component {

    public abstract void doSomething();    public void addChild(Component child){        throw new UnsupportedOperationException("对象不支持这个功能");
    }    public void removeChild(Component child){        throw new UnsupportedOperationException("对象不支持这个功能");
    }    public Component getChildren(int index){        throw new UnsupportedOperationException("对象不支持这个功能");
    }    public List<Component> getAll(){        throw new UnsupportedOperationException("对象不支持这个功能");
    }
}// Leaf:public class Leaf extends Component {
    private String name;    public Leaf(String name){        this.name = name;
    }    @Override
    public void doSomething() {
        System.out.println(name);
    }
}// Composite:public class Composite extends Component {
    private List<Component> list;    //遍历所有元素
    @Override
    public void doSomething() {        if(list != null && list.size()!=0){            //如果是Composite对象 会递归
            list.forEach(element -> element.doSomething());
        }else {
            System.out.println("元素为空");
        }
    }    @Override
    public void addChild(Component child) {        if(list == null){
            list = new ArrayList<>();
        }
        list.add(child);
    }    @Override
    public void removeChild(Component child) {        if(list != null){
            list.remove(child);
        }
    }    @Override
    public Component getChildren(int index) {        if(list != null){            if(index >= 0 && index < list.size()){                return list.get(index);
            }
        }        return null;
    }    @Override
    public List<Component> getAll() {        return this.list;
    }
}//Clientpublic class Client {
    public static void main(String[] args) {       //定义所有的组合对象
       Component root = new Composite("服装");
       Component c1 = new Composite("男装");
       Component c2 = new Composite("女装");       //定义所有的叶子对象
       Component leaf1 = new Leaf("衬衣");
       Component leaf2 = new Leaf("夹克");
       Component leaf3 = new Leaf("裙子");
       Component leaf4 = new Leaf("套装");       //按照树的结构来组合组合对象和叶子对象
       root.addChild(c1);
       root.addChild(c2);      
       c1.addChild(leaf1);
       c1.addChild(leaf2);     
       c2.addChild(leaf3);
       c2.addChild(leaf4);       //调用根对象的输出功能来输出整棵树
       root.doSomething();
    }
}

4. 研磨设计模式

代码语言:yaml
复制
商品的类别树:
    +服装
        +男装
            -衬衣            -夹克        +女装
            -裙子            -套装

对于这种具有整体与部分的关系,并能组合成树形结构的对象结构,对它们用统一的方式进行操作。—>组合模式

组合模式(Composite)的关键就在于这个父抽象类,这个抽象类既可以代表叶子对象,也可以代表组合对象,这样用户在操作的时候,对单个对象和组合对象的使用就具有一致性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA高级架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 定义
  • 2. UML建模图
  • 3. 实现代码:
  • 4. 研磨设计模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档