composite - 对象结构型模式

   1.意图
        将对象组合成树形结构以表示“部分-整体”的层次结构,composite使得用户对
        单个对象和组合对象的使用具有一致性。
      2.参与者
      component -为组合中的对象声明接口
                -在适当的情况下,实现所有类共有接口的缺省行为
                -声明一个接口用于访问和管理component的子组件
                -(可选)在递归结构中定义一个接口,用于访问父
                                    部件,并在合适的情况下实现它
      Leaf      -在组合中表示叶节点对象
                -在组合中定义图元对象的行为
      composite -定义由子部件的那些部件的行为
                -存储子部件
                -在component接口中实现与子部件相关的操作

3.结构

4.代码

public abstract class Component {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	abstract void add(Composite c);
	abstract void remove();//移除当前节点
	abstract void removeAll();//移除当前节点和其后代节点
	abstract void setFather(Composite c);
	abstract List<Composite> getChilds();
	abstract Component getFather();
	abstract Iterator<Composite> createIterable();
	abstract void Traversal();
}


public class Composite extends Component {
	private List<Composite> child;//当child == null时Composite为Leaf
	private Composite father;

	@Override
	void add(Composite c) {
		if (child == null) {
			child = new LinkedList<Composite>();
		}
		c.setFather(this);
		child.add(c);

	}

	@Override
	void remove() {
		if(father != null){
			for(Composite composite:child){
				composite.setFather(father);
				father.getChilds().add(composite);
			}
			father.getChilds().remove(this);
			
		}
	}

	@Override
	Iterator<Composite> createIterable() {
		return child.iterator();
	}

	@Override
	void removeAll() {
		if(father != null){
			father.getChilds().remove(this);
			
		}
	}

	@Override
	void setFather(Composite c) {
		this.father = c;

	}

	@Override
	Component getFather() {
		return father;
	}

	@Override
	List<Composite> getChilds() {
		return child;
	}

	@Override
	void Traversal() {
		System.out.println(this.getName());
		if(child != null){
			for(Composite c:child){
				c.Traversal();
			}
		}
	}

}

public static void main(String[] args) {
		// 创建根节点
		Composite root = new Composite();
		root.setName("中国");
		// 创建省节点
		Composite jx = new Composite();
		jx.setName("江西省");
		Composite gd = new Composite();
		gd.setName("广东省");
		// 创建市节点
		Composite gz = new Composite();
		gz.setName("广州市");
		Composite qy = new Composite();
		qy.setName("清远市");
		Composite ja = new Composite();
		ja.setName("吉安市");
		Composite nc = new Composite();
		nc.setName("南昌市");
		gd.add(gz);
		gd.add(qy);
		
		jx.add(ja);
		jx.add(nc);
		root.add(gd);
		root.add(jx);

		// 层次遍历
		/*Composite visitor = null;
		Queue<Composite> q = new LinkedBlockingDeque<Composite>();
		q.add(root);
		while (!q.isEmpty()) {
			visitor = q.poll();
			System.out.println(visitor.getName());
			List<Composite> childs = visitor.getChilds();
			if(childs != null){
				q.addAll(visitor.getChilds());
			}
		}*/
		//gd.Traversal();
		gd.removeAll();
		root.Traversal();
	}
}

猜你喜欢

转载自blog.csdn.net/kingSolider/article/details/85018937
今日推荐