组合模式

1. 定义

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

2. UML建模图

组合模式_第2张图片

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;
    }
}

//Client

public 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();
    }
}

你可能感兴趣的:(设计模式)