模式定义:
将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个(叶子)对象和组合对象的使用具有一致性。
设计目的:
让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样一来,客户端就不用区分到底是组合对象还是叶子对象了,只需要全部当成组件对象进行统一的操作就可以了。
模式理解:
Composite对应树形结构图。组合体内这些对象都有共同接口,当组合体对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。
【转载使用,请注明出处:http://blog.csdn.net/mahoking】
【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/42218725】
操作实施:
1、首先定义一个接口或抽象类(设计模式通用方式),其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体各个对象的方法。
2、以抽象类或接口的方式定义一个供继承或实现的类或接口。
演示案例:
场景:以插花为例,美丽的花篮,需要各种鲜花与绿植的搭配与点缀。本例当然是以代码的形式构建这样的花篮。
操作步骤:
1、 创建组件的抽象或接口类Component。
/** *组件 * */ public abstract class Component { private String name; public Component(String name) { this.name = name; } /** * 添加组件 * @param component * @return */ public boolean addComponent(Component component) { System.out.println("add "+component.getName()+" Successed!"); return true; } /** * 移除组件 * @param component * @return */ public boolean removeComponent(Component component){ System.out.println("remove "+component.getName()+" Successed!"); return true; } /** * 组合体内访问各个部件的方法 * @return */ public Iterator getIterator() { return null; } public String getName() { return name; } }
2、 创建案例中的花篮FlowerBasket。
/** * 花篮 * */ public class FlowerBasket extends Component { // 定义一个List,用来保存组合体内的各个子对象(鲜花). private List<Component> componentList = new ArrayList<Component>(); public FlowerBasket(String name) { super(name); } @Override public boolean addComponent(Component component) { super.addComponent(component); componentList.add(component); return true; } @Override public boolean removeComponent(Component component) { super.removeComponent(component); componentList.remove(component); return true; } @Override public Iterator getIterator() { return componentList.iterator(); } }
3、 创建鲜花对象Rose,Tulip。
/** * 玫瑰 * */ public class Rose extends Component{ public Rose(String name) { super(name); } } /** * 郁金香 * */ public class Tulip extends Component{ public Tulip(String name) { super(name); } }
4、创建测试类
public class ComponentTest { public static void main(String[] args) { // 创建花篮 String fbName = "花篮"; Component flowerBasket = new FlowerBasket(fbName); // 生成各种鲜花 String roseName = "玫瑰"; String tulipName = "郁金香"; Component rose = new Rose(roseName); Component tulip = new Tulip(tulipName); // 将鲜花添加到花篮中 flowerBasket.addComponent(rose); flowerBasket.addComponent(tulip); Iterator flowers = flowerBasket.getIterator(); System.out.println("====花篮中有哪些花呢?===="); while (flowers.hasNext()) { Component flower = (Component) flowers.next(); System.out.println(flower.getName()); } } }
【转载使用,请注明出处:http://blog.csdn.net/mahoking】
【转载使用,请注明出处:http://blog.csdn.net/mahoking/article/details/42218725】