- 5
- 0
- 约5.68千字
- 约 17页
- 2016-09-26 发布于江苏
- 举报
第七讲 组合(composite)模式 场景 COMPOSITE—Mary今天过生日。我过生日,你要送我一件礼物。嗯,好吧,去商店,你自己挑。这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。喂,买了三件了呀,我只答应送一件礼物的哦。什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。......,MM都会用Composite模式了,你会了没有? 组合模式概述 合成模式将对象组织到树结构中,可以用来描述整体-部分的关系。 合成模式就是一个处理对象的树结构的模式。 合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。 组合模式概述 使用组合模式,可以让用户以一致的方式处理个体对象和组合对象,组合模式的关键在于无论是个体对象还是组合对象都实现了相同的接口或都是同一个抽象类的子类。 组合模式的角色 抽象组件(Component) Composite节点(Composite Node) Leaf节点(Leaf Node) 组合模式的UML类图 安全方式 透明方式 两种方式的比较 对于合成模式而言,在安全性和透明性上,会更看重透明性,毕竟合成模式的目的是:让客户端不再区分操作的是树枝对象还是树叶对象,而是以一个统一的方式来操作。 而且对于安全性的实现,需要区分是树枝对象还是树叶对象。有时候,需要将对象进行类型转换,却发现类型信息丢失了,只好强行转换,这种类型转换必然是不够安全的。 建议多采用透明性的实现方式。 组合模式的优点 组合模式中包含有个体对象和组合对象,并形成树形结构,使用户可以方便地处理个体对象和组合对象。 组合对象和个体对象实现了相同的接口,用户一般不需区分个体对象和组合对象。 当增加新的Composite节点和Leaf节点时,用户的重要代码不需要作出修改。 组合模式示例 1.抽象组件(Component) : MilitaryPerson.java import java.util.*; public interface MilitaryPerson{ public void add(MilitaryPerson person) ; public void remove(MilitaryPerson person) ; public MilitaryPerson getChild(int index); public IteratorMilitaryPerson getAllChildren() ; public boolean isLeaf(); public double getSalary(); public void setSalary(double salary); } 组合模式示例 2. Composite节点(Composite Node): MilitaryOfficer.java import java.util.*; public class MilitaryOfficer implements MilitaryPerson{ LinkedListMilitaryPerson list; String name; double salary; MilitaryOfficer(String name,double salary){ =name; this.salary=salary; list=new LinkedListMilitaryPerson(); } public void add(MilitaryPerson person) { list.add(person); } public void remove(MilitaryPerson person){ list.remove(person); } public MilitaryPerson getChild(int index) { return list.get(index); } public IteratorMilitaryPerson getAllChildren() { return list.iterator(); } public boolean isLeaf(){ return false; }
原创力文档

文档评论(0)