composite pattern


介绍

组合模式将一组相似的对象看作一个对象处理。

使用场景

表示对象的部分-整体层次结构时。

优点

1.可以清楚地定义分层次的复杂对象,方便对整个层次结构进行控制。

2.高层模块调用简单。

3.增加节点自由方便。

缺点

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

UML类图

代码实现

View.java

public abstract class View {
	protected String name;
	
	public View(String name) {
		this.name = name;
	}
	
	public abstract void doSomething();
}

ViewGroup.java

public class ViewGroup extends View{

	private List<View> views = new ArrayList<>();
	
	public ViewGroup(String name) {
		super(name);
	}

	@Override
	public void doSomething() {
		System.out.println(name);
		if (views != null) {
			for(View view : views) {
				view.doSomething();
			}
		}
	}
	
	public void addView(View view) {
		views.add(view);
	}
	
	public void removeView(View view) {
		views.remove(view);
	}
	
	public View getView(int index) {
		return views.get(index);
	}
}

TextView.java

public class TextView extends View {

	public TextView(String name) {
		super(name);
	}

	@Override
	public void doSomething() {
		System.out.println(name);
		System.out.println("This is TextView!");
	}
}

Main.java

public class Main {

	public static void main(String[] args) {
		ViewGroup viewGroup = new ViewGroup("ViewGroup");
		
		ViewGroup branch1 = new ViewGroup("Branch1");
		ViewGroup branch2 = new ViewGroup("Branch2");
		
		TextView tv1 = new TextView("TextView1");
		TextView tv2 = new TextView("TextView2");
		
		branch1.addView(tv1);
		branch2.addView(tv2);
		
		viewGroup.addView(branch1);
		viewGroup.addView(branch2);
		
		viewGroup.doSomething();
	}
}

输出:

ViewGroup
Branch1
TextView1
This is TextView!
Branch2
TextView2
This is TextView!