模式定义:
将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个(叶子)对象和组合对象的使用具有一致性。
设计目的:
让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样一来,客户端就不用区分到底是组合对象还是叶子对象了,只需要全部当成组件对象进行统一的操作就可以了。
模式理解:
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】