设计模式-组合模式
组合模式(Composite Pattern)
组合模式:允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
组合模式结构:
组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口。
叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点。
合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。
客户端(Client):使用 Component 部件的对象。
代码:
//Component:它是一个抽象角色,为要组合的对象提供统一的接口。 public abstract class Component{ public abstract void operation(); //集成该抽象类,叶子节点不能拥有的方法如果调用抛出异常 //枝节点需要,重写这些方法 public void add(Component component) {throw new UnsupportedOperationException();} public void remove(Component component) {throw new UnsupportedOperationException();} public Component getChild(int i) {throw new UnsupportedOperationException();} }
//Leaf:组合中表示子节点对象,叶子节点不能有子节点。 class ConcreteComponent1 extends Component { public void operation() {System.out.println("叶节点1 ");} } class ConcreteComponent2 extends Component { public void operation() {System.out.println("叶节点2");} } class ConcreteComponent3 extends Component { public void operation() {System.out.println("叶节点3");} } //Composite:定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。 public class Composite extends Component{ //保存子节点 private ArrayList<Component> children; public Composite() { //初始化 children = new ArrayList<Component>(); } //遍历调用所有子节点方法 public void operation() { for(Component child: children) { child.operation(); } } //添加子节点 @Override public void add(Component c) {children.add(c);} //移除子节点 @Override public void remove(Component c) {children.remove(c);} //获取子节点 @Override public Component getChild(int i) {return children.get(i);} }
//Client:使用 Component 部件的对象。 public class Client{ public static void main(String[] args){ // 生成树根,并为其增加两个叶子节点 Composite root = new Composite(); root.add(new ConcreteComponent1()); root.add(new ConcreteComponent2()); //创建一个枝节点 Composite branch = new Composite(); // 为branch增加叶节点 branch.add(new ConcreteComponent3()); // 为根增加个枝节点 root.add(branch); // 遍历整棵树 root.operation(); } }
优点:
1、使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2、更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。
缺点:
1、组合模式不容易限制组合中的构件。
应用场景:
1、部分、整体场景,如树形菜单,文件、文件夹的管理。