结构型设计模式之组合模式

定义

又叫部分-整体模式,是一种将对象组合成树状层次结构的模式,用来表示整体和部分的关系,使用户对单个对象和组合对象具有一致的访问方式。

角色构成

1.抽象构件(component):作为树枝构件和树叶构件的接口或抽象基类
2.树叶构件:是组合中的没有子节点的分节点对象,(可以和树枝构件合并,看做是没有子节点的树枝构件),实现抽象构件中的公共接口。
3.树枝构件:是组合中的分支节点对象,有子节点,实现抽象构件中的公共接口。主要作用是管理和存储子节点,一般具有add() remove()和 getChild()方法。

UML类图:

结构型设计模式--组合模式 .jpg
//公共接口
public interface  Node {
    List getChild();
}
//树叶构件,没有子节点 不需要add remove 和 getChild()
public class LeafNode implements Node {

    private String name;

    public LeafNode(String name) {
        this.name = name;
    }

    @Override
    public List getChild() {
        //没有子节点
        return null;
    }

}

//树枝构件,有子节点的分支
public class ChildNode implements Node {

    private String name = "";
    List childNodes = new ArrayList<>();
    public ChildNode(String name) {
        this.name = name;
    }

    @Override
    public List getChild() {
        return childNodes;
    }


    public void addChild(Node node){
        childNodes.add(node);
    }

    public void delChild(Node node){
        childNodes.remove(node);
    }

}


//测试类
public class CompositeClient {

    static ChildNode firstNote = new ChildNode("根");

    public static void setData(){
        firstNote.addChild(new ChildNode("北京"));
        firstNote.addChild(new ChildNode("上海"));
        ChildNode szNode = new ChildNode("深圳");
        firstNote.addChild(szNode);

        szNode.addChild(new ChildNode("龙岗"));
        szNode.addChild(new ChildNode("福田"));
        ChildNode areaNode = new ChildNode("南山");
        szNode.addChild(areaNode);

        areaNode.addChild(new ChildNode("蛇口"));
        areaNode.addChild(new ChildNode("南园"));
        ChildNode dotNote = new ChildNode("南山");
        areaNode.addChild(dotNote);
        areaNode.addChild(new LeafNode("南油"));

        System.out.println(firstNote);
    }

    public static void main(String[] args) {
        setData();
    }

}

组合模式的主要优点有:
组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

其主要缺点是:
设计较复杂,客户端需要花更多时间理清类之间的层次关系;
不容易限制容器中的构件;
不容易用继承的方法来增加构件的新功能;

你可能感兴趣的:(结构型设计模式之组合模式)