设计模式【组合模式】
来源:互联网 发布:日本海军知耻 陆军马鹿 编辑:程序博客网 时间: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】
- 设计模式:组合模式
- 设计模式-----组合模式
- 设计模式 组合模式
- 设计模式--组合模式
- 设计模式---组合模式
- 【设计模式】组合模式
- 设计模式 - 组合模式
- 设计模式----组合模式
- 设计模式 - 组合模式
- 设计模式:组合模式
- 设计模式 - 组合模式
- 设计模式-组合模式
- 设计模式 - 组合模式
- 【设计模式】组合模式
- 设计模式--组合模式
- 设计模式-组合模式
- 设计模式:组合模式
- 设计模式-----组合模式
- 1031. QQ帐户的申请与登陆(25)
- lcc源代码解析之input.c
- poj 1141 括号匹配
- 【ruby学习笔记】初探ruby
- matlab图像处理(如何从像素中获得图像的信息)
- 设计模式【组合模式】
- poj 3274 哈希
- 奶攀遮扇橇使档歉凳墓玫参椒吨仪
- poj1321 棋盘问题(DFS)
- linux下安装boost (转)
- 转载_大牛讲解信号与系统
- Android 实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音
- Uva 10815 Andy's First Dictionary
- .net应用程序的配置介绍及基本配置方法(一)