组合模式--Composite
Composite模式定义:
将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.
Composite好处:
1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。
Component:为参加组合的对象声明一个公共接口,不管是组合还是叶节点。
public abstract class Component { public void add(Component component) { throw new UnsupportedOperationException(); } public void remove(Component component) { throw new UnsupportedOperationException(); } public Component getChild(int i) { throw new UnsupportedOperationException(); } public void operation() { throw new UnsupportedOperationException(); } }
Leaf:在组合中表示叶节点对象,叶节点没有子节点。
public class Leaf extends Component { @Override public void operation() { //your code } }
Composite:表示参加组合的有子对象的对象,并给出树枝构件的行为。
public class Composite extends Component { ArrayList<Component> components = new ArrayList<Component>(); @Override public void add(Component component) { components.add(component); } @Override public void remove(Component component) { components.remove(component); } @Override public Component getChild(int i) { return components.get(i); } @Override public void operation() { for (Component component : components) { component.operation(); } } }
适用性:
以下情况使用Composite模式:
1. 你想表示对象的部分-整体层次结构。
2. 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
优点:
1. 组合模式可以很容易的增加新的构件。
2. 使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁。
缺点:
1. 使用组合模式后,控制树枝构件的类型不太容易。
2. 用继承的方法来增加新的行为很困难。