【设计模式】【17】组合模式

【设计模式】【17】组合模式,第1张

应用场景

组合模式,又叫部分整体模式,英文名Composite Pattern

该模式将所有对象视为树状结构中的一个节点,所有对象的结构是完全一致的,且具备容器的功能,每个节点都可以再包含多个子节点

这种模式可以用来实现上级-下级,或是整体-部分的关系

组合模式有两种实现方式

  • 一种是通过一个统一的节点类,来表示所有对象,任何一个对象都可以拥有上级节点,或添加下级节点
  • 另一种是将根节点、枝节点、叶节点分别用三种不同的类来表示,根节点不允许拥有上级节点,叶节点不允许添加下级节点

第一种更加灵活,因为大多时候,根节点、枝节点、叶节点是没有绝对界限的,叶节点拥有了下级就会成为枝节点,枝节点删除了所有下级就会成为叶节点

第二种更加严格,适合只读不可改的树结构,或者是在添加节点时,就能实现预知该节点以后有没有下级节点的情况

实现代码一


	@SuppressWarnings("all")
	public class Node {
	
	    Node parent;
	
	    List<Node> children;
	
	    public void exec() {
	        //无下级节点时,自己处理
	        if (children == null) {
	            System.out.println("root node exec");
	            return;
	        }
	        //有下级节点时,转发给下级处理
	        for (Node child : children)
	            child.exec();
	    }
	
	    public Node getParent() {
	        return parent;
	    }
	
	    public List<Node> getChildren() {
	        return children;
	    }
	
	    public void setParent(Node parent) {
	        this.parent = parent;
	    }
	
	    public void add(Node node) {
	        children.add(node);
	        node.setParent(this);
	    }
	
	    public void remove(Node node) {
	        children.remove(node);
	        node.setParent(null);
	    }
	}

实现代码二


	abstract public class Node {
	
	    abstract public void exec();
	
	    abstract public BranchNode getParent();
	
	    abstract public List<Node> getChildren();
	
	    abstract public void setParent(BranchNode parent);
	
	    abstract public void add(Node node);
	
	    abstract public void remove(Node node);
	}


	//叶节点,底层节点,无下级
	@SuppressWarnings("all")
	public class LeafNode extends Node {
	
	    BranchNode parent;
	
	    @Override
	    public void exec() {
	        System.out.println("LeafNode exec");
	    }
	
	    @Override
	    public BranchNode getParent() {
	        return parent;
	    }
	
	    @Override
	    public List<Node> getChildren() {
	        throw new RuntimeException("LeafNode cannot have children");
	    }
	
	    @Override
	    public void setParent(BranchNode parent) {
	        this.parent = parent;
	    }
	
	    @Override
	    public void add(Node node) {
	        throw new RuntimeException("LeafNode cannot have children");
	    }
	
	    @Override
	    public void remove(Node node) {
	        throw new RuntimeException("LeafNode cannot have children");
	    }
	}


	//枝节点,中间节点,有上级也有下级
	public class BranchNode extends Node {
	
	    BranchNode parent;
	
	    List<Node> children;
	
	    @Override
	    public void exec() {
	        for (Node child : children)
	            child.exec();
	    }
	
	    @Override
	    public BranchNode getParent() {
	        return parent;
	    }
	
	    @Override
	    public List<Node> getChildren() {
	        return children;
	    }
	
	    @Override
	    public void setParent(BranchNode parent) {
	        this.parent = parent;
	    }
	
	    @Override
	    public void add(Node node) {
	        children.add(node);
	        node.setParent(this);
	    }
	
	    @Override
	    public void remove(Node node) {
	        children.remove(node);
	        node.setParent(null);
	    }
	}


	//根节点,顶级节点,无上级
	//根节点可视为一种特殊的枝节点
	@SuppressWarnings("all")
	public class RootNode extends BranchNode {
	
	    LeafNode parent;
	
	    List<Node> children;
	
	    @Override
	    public void exec() {
	        for (Node child : children)
	            child.exec();
	    }
	
	    @Override
	    public BranchNode getParent() {
	        throw new RuntimeException("RootNode cannot have parent");
	    }
	
	    @Override
	    public List<Node> getChildren() {
	        return children;
	    }
	
	    @Override
	    public void setParent(BranchNode parent) {
	        throw new RuntimeException("RootNode cannot have parent");
	    }
	
	    @Override
	    public void add(Node node) {
	        children.add(node);
	        node.setParent(this);
	    }
	
	    @Override
	    public void remove(Node node) {
	        children.remove(node);
	        node.setParent(null);
	    }
	
	    //对整个树进行数据统计
	    public void statistic(){
	        System.out.println("tree statistic");
	    }
	}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/730597.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存