zoukankan      html  css  js  c++  java
  • Java 实现组合(Composite)模式

    类图


    /**
     * 树	总体
     * 
     * @author stone
     * 
     */
    public class Tree {
    	private TreeNode root; //根节点
    
    	public Tree(String name) {
    		this.root = new TreeNode(name);
    	}
    	
    	public TreeNode getRoot() {
    		return root;
    	}
    }
    /**
     * 树节点 部份
     * 也能够自身代表树:一堆节点组成了一颗树
     * 
     * @author stone
     * 
     */
    public class TreeNode {
    
    	private String name;
    	private TreeNode parent;
    	private List<TreeNode> children;
    	
    	public TreeNode(String name) {
    		this.name = name;
    		this.children = new ArrayList<TreeNode>();
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setParent(TreeNode parent) {
    		this.parent = parent;
    	}
    
    	public TreeNode getParent() {
    		return parent;
    	}
    	
    	public List<TreeNode> getChildren() {
    		return children;
    	}
    	
    	public void add(TreeNode node) {
    		this.children.add(node);
    	}
    	
    	public void remove(TreeNode node) {
    		this.children.remove(node);
    	}
    }
    

    /*
     * 组合(Composite)模式  又叫做部分-总体模式
     * 它使我们层级、树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序能够像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦
     * 以下情况下适用Composite模式:
    		1.你想表示对象的部分-总体层次结构
    		2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的全部对象。
     */
    public class Test {
    	public static void main(String[] args) {
    //		Tree treeA = new Tree("A");
    //		treeA.getRoot().add(new TreeNode("B"));
    //		treeA.getRoot().add(new TreeNode("C"));
    //		TreeNode treeNodeD = new TreeNode("D");
    //		treeNodeD.add(new TreeNode("D1"));
    //		treeNodeD.add(new TreeNode("D2"));
    //		treeA.getRoot().add(treeNodeD);
    //		print(treeA.getRoot());
    		/*
    		 * 上面使用了Tree对象,
    		 * 以下仅仅使用TreeNode对象,符合组合模式的定义,既代表部分也代表总体
    		 */
    		TreeNode treeA = new TreeNode("A");
    		treeA.add(new TreeNode("B"));
    		treeA.add(new TreeNode("C"));
    		TreeNode treeNodeD = new TreeNode("D");
    		treeNodeD.add(new TreeNode("D1"));
    		treeNodeD.add(new TreeNode("D2"));
    		treeA.add(treeNodeD);
    		print(treeA);
    		/*
    		 * 其它演示样例:文件系统{文件夹、文件}, 相似这样的可用递归遍历的结构,
    		 * 用一个对象就能表示部分与总体,都能够用组合模式
    		 */
    
    	}
    	
    	public static void print(TreeNode root) {
    		if (root == null) return;
    		LinkedList<TreeNode> linkedList = new LinkedList<TreeNode>();  
    		linkedList.add(root);
    		while (!linkedList.isEmpty()) {
    			TreeNode node = linkedList.removeFirst();
    			System.out.println(node.getName());
    			List<TreeNode> children = node.getChildren();
    			for (int i = 0; i < children.size(); i++) {
    				TreeNode next = children.get(i);
    				List<TreeNode> children2 = next.getChildren();
    				if (!children2.isEmpty()) {
    					linkedList.add(next);
    				} else {
    					System.out.println(next.getName());
    				}
    			}
    		}
    	}
    }

    打印

    A
    B
    C
    D
    D1
    D2



  • 相关阅读:
    Vmware Vsphere WebService之vijava 开发一-vcenter连接、及集群信息获取
    Vmware Vsphere WebService SDK开发(第一讲)-基本知识学习
    RabbitMQ安装以及java使用(二)
    redis单机安装以及集群搭建(redis-6.2.6)
    Spring Cloud Gateway中Filter获取Request Body的几种方式
    电子发票插入微信卡包之PDF上传
    Elasticsearch集群搭建详解
    微服务的设计原则
    centos 7.4 64位 mysql的安装
    RabbitMQ安装以及java使用(一)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4036971.html
Copyright © 2011-2022 走看看