组合模式(Composite)

来源:互联网 发布:通达信数据导出 编辑:程序博客网 时间:2024/06/04 01:21

1. 定义

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

2. UML建模图

这里写图片描述

Component(抽象构件接口)

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

Leaf(叶部件)

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

Composite(组合类)

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

Client(客户端)

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

3. 实现代码:

// 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. 研磨设计模式

商品的类别树:    +服装        +男装            -衬衣            -夹克        +女装            -裙子            -套装

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

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

0 0