设计模式【组合模式】

来源:互联网 发布:日本海军知耻 陆军马鹿 编辑:程序博客网 时间:2024/05/21 05:22

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

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

模式理解:
       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);}@Overridepublic boolean addComponent(Component component) {super.addComponent(component);componentList.add(component);return true;}@Overridepublic boolean removeComponent(Component component) {super.removeComponent(component);componentList.remove(component);return true;}@Overridepublic 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

 

1 0
原创粉丝点击