佛山cms模板建站,深圳 赢客创想网络技术股份有限公司 网站建设,安卓手机建站,帝国和WordPress比较Composite定义#xff1a;将对象以树形结构组织起来#xff0c;以达成“部分#xff0d;整体” 的层次结构#xff0c;使得客户端对单个对象和组合对象的使用具有一致性。Composite比较容易理解#xff0c;想到Composite就应该想到树形结构图。组合体内这些对象都有共同接…Composite定义将对象以树形结构组织起来以达成“部分整体” 的层次结构使得客户端对单个对象和组合对象的使用具有一致性。Composite比较容易理解想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口当组合体一个对象的方法被调用执行时Composite将遍历(Iterator)整个树形结构寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。所以Composite模式使用到Iterator模式和Chain of Responsibility模式类似。Composite好处 使客户端调用简单客户端可以一致的使用组合结构或其中单个对象用户就不必关系自己处理的是单个对象还是整个组合结构这就简化了客户端代码。更容易在组合体内加入对象部件。客户端不必因为加入了新的对象部件而更改代码。如何使用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.namename; }
} 抽象类Equipment就是Component定义代表着组合体类的对象们,Equipment中定义几个共同的方法。 public class Disk extends Equipment{public Disk(String name) { super(name); }//定义Disk网络价格为1public double netPrice() { return 1.; }//定义了disk折扣价格是0.5 对折。public double discountPrice() { return .5; }
} Disk是组合体内的一个对象或称一个部件这个部件是个单独元素( Primitive)。 还有一种可能是一个部件也是一个组合体就是说这个部件下面还有儿子这是树形结构中通常的情况应该比较容易理解。现在我们先要定义这个组合体 abstract class CompositeEquipment extends Equipment{private int i0;//定义一个Vector 用来存放儿子private Lsit equipmentnew ArrayList();public CompositeEquipment(String name) { super(name); }public boolean add(Equipment equipment) {this.equipment.add(equipment);return true;}public double netPrice(){double netPrice0.;Iterator iterequipment.iterator();for(iter.hasNext())netPrice((Equipment)iter.next()).netPrice();return netPrice;}public double discountPrice(){double discountPrice0.;Iterator iterequipment.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 iequipment.size(); }//重载Iterator方法public Object next(){if(hasNext())return equipment.elementAt(i);elsethrow new NoSuchElementException();}
} 上面CompositeEquipment继承了Equipment同时为自己里面的对象们提供了外部访问的方法重载了IteratorIterator是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 .5super.discountPrice(); }
}public class Cabinet extends CompositeEquipment{public Cabinet(String name) { super(name); }public double netPrice() { return 1.super.netPrice(); }public double discountPrice() { return .5super.discountPrice(); }
} 至此我们完成了整个Composite模式的架构。我们可以看看客户端调用Composote代码 Cabinet cabinetnew Cabinet(Tower);Chassis chassisnew Chassis(PC Chassis);
//将PC Chassis装到Tower中 (将盘盒装到箱子里)
cabinet.add(chassis);
//将一个10GB的硬盘装到 PC Chassis (将硬盘装到盘盒里)
chassis.add(new Disk(10 GB));//调用 netPrice()方法;
System.out.println(netPricecabinet.netPrice());
System.out.println(discountPricecabinet.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提供用于访问自己组合体内的部件方法增加、删除、遍历。结合我的其他模式中对Jive的分析我们已经基本大体理解了Jive论坛体系的框架如果你之前不理解设计模式而直接去看Jive源代码你肯定无法看懂。 系列文章 Java设计模式1工厂模式Factory模式 Java设计模式2单态模式Singleton模式 Java设计模式3建造者模式Builder模式 Java设计模式4原型模式Prototype模式 Java设计模式5共享模式/享元模式Flyweight模式 Java设计模式6桥模式Bridge模式 Java设计模式7装饰模式Decorator模式 Java设计模式8组合模式Composite模式 Java设计模式9适配器模式Adapter模式 Java设计模式10代理模式Proxy模式 Java设计模式11外观模式Facade模式 Java设计模式12迭代模式Iterator模式 Java设计模式13模板模式Template模式 Java设计模式14责任链模式Chain of Responsibility模式 Java设计模式15备忘录模式Memento模式 Java设计模式16中介模式Mediator模式 Java设计模式17解释器模式Interpreter模式 Java设计模式18策略模式Strategy模式 Java设计模式19状态模式State模式 Java设计模式20观察者模式Observer模式 Java设计模式21访问模式Visitor者模式 Java设计模式22命令模式Command模式转载于:https://www.cnblogs.com/Coda/p/4296397.html