zoukankan      html  css  js  c++  java
  • 大话设计模式读书笔记(十六) 组合模式

    组合模式:

    组合模式(Composite):将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    组合模式UMl结构图:



    java代码实现:

    /**
     *Compoent为组合中的对象声明一个接口
     *在适当情况下,实现所有类共有接口的默认行为。
     *声明一个接口用于访问和管理Compoent的子部件
     */
    public abstract class Compoent {
    	protected String name;
    
    	public Compoent(String name) {
    		super();
    		this.name = name;
    	}
    	
    	//通常用add和remove方法来提供增加和移除树叶或树枝的功能
    	public abstract void add(Compoent c);
    	public abstract void reomve(Compoent c);
    	public abstract void display(int depth);
    }
    
    //Leaf在组合表示树叶节点,树叶没有子节点
    public class Leaf extends Compoent{
    	public Leaf(String name) {
    		super(name);
    	}
    	/**
    	 * 由于树叶没有再增加分支和树叶,所以Add和remove方法再实现他们没有意义
    	 * 但这样做可以消除叶节点和枝节点在抽象层次的区别,他们具备完全一致的接口
    	 */
    	@Override
    	public void add(Compoent c) {
    		System.out.println("不能再增加子节点");
    	}
    	@Override
    	public void reomve(Compoent c) {
    		System.out.println("没有子节点可以被移除");
    	}
    	@Override
    	public void display(int depth) {
    		//叶节点的具体方法,此处是显示其名称和级别
    		System.out.println("-"+depth+name);
    	}
    }
    

    public class Composite extends Compoent{
    	
    	private List<Compoent> childen = new ArrayList<Compoent>();
    	public Composite(String name) {
    		super(name);
    	}
    	@Override
    	public void add(Compoent c) {
    		childen.add(c);
    	}
    	@Override
    	public void reomve(Compoent c) {
    		childen.remove(c);
    	}
    	@Override
    	public void display(int depth) {
    		//显示其枝节点名称,并对其下级遍历
    		System.out.println("-"+depth+name);
    		for (Compoent compoent : childen) {
    			compoent.display(depth+2);
    		}
    	}
    }
    

    public class Mian {
    	public static void main(String[] args) {
    		//生成跟节点root ,根上长有两个子节点LeafA和LeafB
    		Composite root  = new Composite("root");
    		root.add(new Leaf("Leaf A"));
    		root.add(new Leaf("Leaf B"));
    		
    		//根上长有一个分支compositex,分支上长有两篇树叶Leaf XA和Leaf XB
    		Composite compositex = new Composite("Composite X");
    		compositex.add(new Leaf("Leaf XA"));
    		compositex.add(new Leaf("Leaf XB"));
    		root.add(compositex);
    		
    		//分支compositex上长有另一个分支compositeXy
    		//并且另一个分支compositeXy上又长有两个树叶Leaf XYA和Leaf XYB
    		Composite compositeXy = new Composite("Composite XY");
    		compositeXy.add(new Leaf("Leaf XYA"));
    		compositeXy.add(new Leaf("Leaf XYB"));
    		compositex.add(compositeXy);
    		
    		//树根root上又长了两片树叶Leaf C和Leaf D
    		//但是Leaf D没长牢,被风吹走了
    		root.add(new Leaf("Leaf C"));
    		Leaf leaf = new Leaf("Leaf D");
    		root.add(leaf);
    		root.reomve(leaf);
    		
    		//显示大树的样子
    		root.display(1);
    	}
    }
    

    组合模式使用场景:

    当你发现需求中是体现部分与整体层次的结构时,以及你希望客户忽略组合对象和单个对象的不同,同一地使用组合结构的所有对象时,就应该考虑组合模式。
  • 相关阅读:
    几个常用排序的代码实现堆排序|快排|归并排序 Marathon
    0647回文子串 Marathon
    任意输入一个日期输出是当年的第几天星期几
    从输入URL到浏览器显示页面发生了什么
    常用链接整理
    computed 与 method
    将博客搬至CSDN
    leetcode_Two Sum
    VC++6.0与Office2010冲突解决方案
    C&C++_malloc函数
  • 原文地址:https://www.cnblogs.com/xsyfl/p/6842506.html
Copyright © 2011-2022 走看看