首页 > 代码库 > 设计模式【组合模式】

设计模式【组合模式】

模式定义:
       将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个(叶子)对象和组合对象的使用具有一致性。

设计目的:
       让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样一来,客户端就不用区分到底是组合对象还是叶子对象了,只需要全部当成组件对象进行统一的操作就可以了。

模式理解:
       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

 

设计模式【组合模式】