`
itwoody
  • 浏览: 41580 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

java设计模式之 Composite(组合)

阅读更多
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;
    }
    
    //注意这里,这里就提供用于访问自己组合体内的部件方法。
    //上面dIsk 之所以没有,是因为Disk是个单独(Primitive)的元素.
    public Iterator iter()
    {
      return equipment.iterator()
    {
    //重载Iterator方法
     public boolean hasNext() { return i<equipment.size(); }<br="">     //重载Iterator方法
     public Object next()
     {
      if(hasNext())
         return equipment.elementAt(i++);
      else
          throw new NoSuchElementException();
     }
    
  }
  
  上面CompositeEquipment继承了Equipment,同时为自己里面的对象们提供了外部访问的方法,重载了Iterator,Iterator是Java的Collection的一个接口,是Iterator模式的实现.
我们再看看CompositeEquipment的两个具体类:盘盒Chassis和箱子Cabinet,箱子里面可以放很多东西,如底板,电源盒,硬盘盒等;盘盒里面可以放一些小设备,如硬盘 软驱等。无疑这两个都是属于组合体性质的。
  
  public class Chassis extends CompositeEquipment
  {
     public Chassis(String name) { super(name); }
     public double netPrice() { return 1.+super.netPrice(); }
     public double discountPrice() { return .5+super.discountPrice(); }
  }
  public class Cabinet extends CompositeEquipment
  {
     public Cabinet(String name) { super(name); }
     public double netPrice() { return 1.+super.netPrice(); }
     public double discountPrice() { return .5+super.discountPrice(); }
  }
  
  至此我们完成了整个Composite模式的架构。
  
  我们可以看看客户端调用Composote代码:
  
  Cabinet cabinet=new Cabinet("Tower");
  
  Chassis chassis=new Chassis("PC Chassis");
  //将PC Chassis装到Tower中 (将盘盒装到箱子里)
  cabinet.add(chassis);
  //将一个10GB的硬盘装到 PC Chassis (将硬盘装到盘盒里)
  chassis.add(new Disk("10 GB"));
  
  //调用 netPrice()方法;
  System.out.println("netPrice="+cabinet.netPrice());
  System.out.println("discountPrice="+cabinet.discountPrice());
  
  上面调用的方法netPrice()或discountPrice(),实际上Composite使用Iterator遍历了整个树形结构,寻找同样包含这个方法的对象并实现调用执行.
  
  Composite是个很巧妙体现智慧的模式,在实际应用中,如果碰到树形结构,我们就可以尝试是否可以使用这个模式。
  
  以论坛为例,一个版(forum)中有很多帖子(message),这些帖子有原始贴,有对原始贴的回应贴,是个典型的树形结构,那么当然可以使用Composite模式,那么我们进入Jive中看看,是如何实现的.
  
  Jive解剖
  在Jive中 ForumThread是ForumMessages的容器container(组合体).也就是说,ForumThread类似我们上例中的 CompositeEquipment.它和messages的关系如图:
  [thread]
     |- [message]
     |- [message]
        |- [message]
        |- [message]
           |- [message]
  
  我们在ForumThread看到如下代码:
  
  public interface ForumThread {
     ....
     public void addMessage(ForumMessage parentMessage, ForumMessage newMessage)
           throws UnauthorizedException;
     public void deleteMessage(ForumMessage message)
           throws UnauthorizedException;
  
   
     public Iterator messages();
        ....
  }
  
  类似CompositeEquipment, 提供用于访问自己组合体内的部件方法: 增加 删除 遍历.
分享到:
评论

相关推荐

    JAVA设计模式chm文档

    设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of ...

    JAVA设计模式之结构模式

    这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...

    33种JAVA设计模式DEMO

    这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式...

    java设计模式之组合模式(Composite)

    主要为大家详细介绍了java设计模式之组合模式Composite,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Java设计模式之组合模式(Composite模式)介绍

    主要介绍了Java设计模式之组合模式(Composite模式)介绍,Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性,需要的朋友可以参考下

    Java 设计模式

    java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元...

    设计模式_组合模式.zip

    这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的...

    java设计模式教程+源代码

    Composite ( 组合模式 ) Decorator ( 装饰模式 ) Facade ( 外观模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    java设计模式之组合模式.docx

    把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。就像是图书管理员对图书馆的书籍进行整理,既可以对每一部分...容器(Composite)构建角色:有容器的特征,可以包含子节点。

    JAVA设计模式-day2.pdf

    JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    java的设计模式大体上分为三大类: 2 设计模式遵循的原则有6个: 2 1. 工厂模式(Factory Method) 2 2. 抽象工厂模式(Abstract Factory) 3 3. 单例模式(Singleton) 4 4.建造者模式(Builder) 4 5. 原型模式...

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) 5. 抽象工厂模式 (Abstract Factory) 6. ...

    组合模式(Composite Pattern)原理图

    组合模式(Composite Pattern)是一种对象结构型模式,其定义是将多个对象组合成树形结构以表示“整体-部分”关系的层次结构。它使得客户端对单个对象和组合对象的使用具有一致性。在组合模式中,对象被组织成树形...

    23种java版设计模式源码案例.zip

    23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) 抽象工厂(abstract) 单例模式(singleton) 建造者模式(builder) 原型模式(prototype) 结构型模式...

    23种java设计模式

    2、结构模式:Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)。3、行为模式:Iterator(迭代模式)、Template(模板...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    Java设计模式(含代码)

    Java设计模式 (含有相关源码) Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 Adapter:将一个类的接口转换成客户希望的另一个接口,使得原来由于接口不兼容而不能...

    java设计模式源码-DesignPattern:设计模式(Java实现源码)

    java ...组合模式(compositePattern) 装饰器模式(decoratorPattern) 外观模式(facadePattern) 享元模式(flyweightPattern) 代理模式(proxyPattern) 责任链模式(chainPattern) 命令模式(commandPatter

    JAVA设计模式.rar

    策略模式【STRATEGY PATTERN】 代理模式【PROXY PATTERN】 单例模式【SINGLETON PATTERN】  多例模式【MULTITION PATTERN】  工厂方法模式【FACTORY METHOD ...组合模式【COMPOSITE PATTERN】 ......

Global site tag (gtag.js) - Google Analytics