关闭

java设计模式之合成模式

223人阅读 评论(0) 收藏 举报
分类:

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

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

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

安全模式代码

/**
 * @类名 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对象,具体的类型对于客户端而言是透明的,是无须关心的。

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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:118695次
    • 积分:2119
    • 等级:
    • 排名:第17955名
    • 原创:72篇
    • 转载:133篇
    • 译文:0篇
    • 评论:42条
    联系方式
    邮箱

    zx_fendoubuzhi@126.com
    最新评论