最新消息

java组合模式

设计模式 金牌剑客 1289℃ 0评论

定义

将对象组合成树形结构已表示“部分-整体”的层次机构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

类图

composite

Component:抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现。

Leaf:叶子节点对象,定义和实现叶子对象的行为,不再包含其他的子节点对象。

Composite:组合对象,通常会存储子组件,定义包含子组件的那些组件的行为,并实现在组件接口中定义的与子组件有关的操作。

典型的Composite对象结构如下图所示:
composite_example

java源代码

Component.java

public abstract class Component {
	public abstract void operator();
	public void addChild(Component child) {
		throw new UnsupportedOperationException("对象不支持此功能");
	}
	public void removeChild(Component child) {
		throw new UnsupportedOperationException("对象不支持此功能");
	}
	public Component getChild(int index) {
		throw new UnsupportedOperationException("对象不支持此功能");
	}
}

Leaf.java

public class Leaf extends Component {
	private String name;
	public Leaf(String name){
		this.name = name;
	}
	public void operator(){
		System.out.println("叶子节点,name为:" + name);
	}
}

Composite.java

public class Composite extends Component {
	private List<Component> list;
	public Composite(){
		this.list = new ArrayList<>();
	}
	public void operator(){
		for(Component component : list){
			component.operator();
		}
	}
	@Override
	public void addChild(Component child) {
		list.add(child);
	}
	@Override
	public void removeChild(Component child) {
		list.remove(child);
	}
	@Override
	public Component getChild(int index) {
		return list.get(index);
	}
}

Client.java

public class Client {
	public static void main(String[] args) {
		Component leaf = new Leaf("aLeaf");
		leaf.operator();
		Component composite = new Composite();
		composite.addChild(new Leaf("bLeaf"));
		composite.addChild(new Leaf("cLeaf"));
		composite.operator();
	}
}

使用场景

引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。

转载请注明:QualInfo » java组合模式

喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址