java设计模式之合成模式

==============合成模式,一种把对象组装成树结构的模式.为的是突显单独元素在整体中的位置,并且整体中的任何部分,客户端都可以平等调用(同目录和文件的区别)=====

=============安全模式,旨在不让用户调用叶子节点的管理子节点功能(因为叶子节点并没有子节点)==

=============透明模式,旨在方便用户使用,用户并不在意手里的节点是否是叶子节点,直接使用即可==

安全模式代码

/**
 * @类名 Component.java
 * @作者  zx
 * @创建日期 2016年8月31日
 * @描述 安全模式的合成模式
 * @版本 V 1.0
 */
public interface Component {
	void print(String preStr);
}

public class Composition implements Component {

	private List<Component> components = new ArrayList<Component>();
	
	private String name;
	
	public Composition(String name) {
		this.name = name;
	}

	@Override
	public void print(String preStr) {
		System.out.println(preStr +"  " +name);
		if(null != components){
			for (Component component : components) {
				preStr+="  ";
				component.print(preStr);
			}
		}
	}
	
	public void  addChild(Component component){
		components.add(component);
	}

	public void remove(int  index){
		components.remove(index);
	}
	
	public List<Component> getChild(){
		return components;
	}
	
}

public class Leaf implements Component {

	private String name;
	
	
	public Leaf(String name) {
		this.name = name;
	}

	@Override
	public void print(String preStr) {
		System.out.println(name);
	}

}

public class TestMain {
	public static void main(String[] args) {
		Composition root = new Composition("衣服");
		Composition c1 = new Composition("男装");
		Composition c2 = new Composition("女装");
		Leaf l1 = new Leaf("西装");
		Leaf l2 = new Leaf("燕尾服");
		Leaf l3 = new Leaf("旗袍");
		Leaf l4 = new Leaf("晚礼服");
		root.addChild(c1);
		root.addChild(c2);
		c1.addChild(l1);
		c1.addChild(l2);
		c2.addChild(l3);
		c2.addChild(l4);
		root.print("");
	}
}

透明模式的部分代码

/**
 * @类名 Component.java
 * @作者  zx
 * @创建日期 2016年8月31日
 * @描述 透明模式的合成模式
 * @版本 V 1.0
 */
public abstract class Component_lucency {
	
	abstract void print(String preStr);
	
	public void  addChild(Component component){
		throw new RuntimeException("叶子节点无法调用此方法或者子节点未从写此方法");
	}

	public void remove(int  index){
		throw new RuntimeException("叶子节点无法调用此方法或者子节点未从写此方法");
	}
	
	public List<Component> getChild(){
		throw new RuntimeException("叶子节点无法调用此方法或者子节点未从写此方法");
	}
}

两种实现方法的选择

  这里所说的安全性合成模式是指:从客户端使用合成模式上看是否更安全,如果是安全的,那么就不会有发生误操作的可能,能访问的方法都是被支持的。

  这里所说的透明性合成模式是指:从客户端使用合成模式上,是否需要区分到底是“树枝对象”还是“树叶对象”。如果是透明的,那就不用区分,对于客户而言,都是Compoent对象,具体的类型对于客户端而言是透明的,是无须关心的。

  对于合成模式而言,在安全性和透明性上,会更看重透明性,毕竟合成模式的目的是:让客户端不再区分操作的是树枝对象还是树叶对象,而是以一个统一的方式来操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值