点击这里给我发消息 点击这里给我发消息

Java设计模式之Composite模式

添加时间:2013-12-7
    相关阅读: 设计

  Composite定义:

  将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.

  Composite比较容易理解,想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行 时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。

  所以Composite模式使用到Iterator模式,和Chain of Responsibility模式类似。

  Composite好处:

  1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。

  2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。

  如何使用Composite?

  首先定义一个接口或抽象类,这是设计模式通用方式了,其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们(或称部件Component).

  下面的代码是以抽象类定义,一般尽量用接口interface,

  public abstract class Equipment

  {

  private String name;

  //实价

  public abstract double netPrice();

  //折扣价格

  public abstract double discountPrice();

  //增加部件方法

  public boolean add(Equipment equipment) { return false; }

  //删除部件方法

  public boolean remove(Equipment equipment) { return false; }

  //注意这里,这里就提供一种用于访问组合体类的部件方法。

  public Iterator iter() { return null; }

  public Equipment(final String name) { this.name=name; }

  }

  抽象类Equipment就是Component定义,代表着组合体类的对象们,Equipment中定义几个共同的方法。

  public class Disk extends Equipment

  {

  public Disk(String name) { super(name); }

  //定义Disk实价为1

  public double netPrice() { return 1; }

  //定义了disk折扣价格是0.5 对折。

  public double discountPrice() { return 0.5; }

  }

  Disk是组合体内的一个对象,或称一个部件,这个部件是个单独元素( Primitive)。

  还有一种可能是,一个部件也是一个组合体,就是说这个部件下面还有'儿子',这是树形结构中通常的情况,应该比较容易理解。现在我们先要定义这个组合体:

  abstract class CompositeEquipment extends Equipment

  {

  private int i=0;

  //定义一个Vector 用来存放'儿子'

  private Lsit equipment=new ArrayList();

  public CompositeEquipment(String name) { super(name); }

  public boolean add(Equipment equipment) {

  this.equipment.add(equipment);

  return true;

  }

  public double netPrice()

  {

  double netPrice=0.;

  Iterator iter=equipment.iterator();

  for(iter.hasNext())

  netPrice+=((Equipment)iter.next()).netPrice();

  return netPrice;

  }

  public double discountPrice()

  {

  double discountPrice=0.;

  Iterator iter=equipment.iterator();

  for(iter.hasNext())

  discountPrice+=((Equipment)iter.next()).discountPrice();

  return discountPrice;

  }

[1] [2] 下一页

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册