设计模式——组合模式

来源:互联网 发布:免煎中药淘宝 编辑:程序博客网 时间:2024/06/07 17:40

组合模式

定义:允许你将对象组合成树形来表达结构来表现“整体/部分”层次结构。组合能让用户以一致的方式处理个别对象及对象组合。

角色

  1. component :是组合中对象的接口,适当情况下,实现所有类共有方法的默认行为,声明一个接口,用于管理和访问component子部件
  2. composite:定义具有叶节点的组件的行为
  3. leaf:定义叶节点的行为
  4. client:使用component接口操作组件行为

适用场合

  1. 想表示对象的部分-整体层次结构,如树形菜单,文件、文件夹的管理
  2. 希望用户忽略组合对象与单个对象的不同,使用户一同一种方式使用组合结构中的所有对象。

好处

  1. 定义了包含基本对象和组合对象的类层次结构,基本对象可以被组合成更复杂的组合对象,而这个组合对象有可以被组合。
  2. 简化客户代码,客户可以一直地使用组合结构和单个对象,通常用户不知道处理的是一个叶节点还是一个组合组件。
  3. 使得更容易增加新类型的组件, 新定义的Composite或leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需要因为新的Component类而改变。
  4. 使你的设计变得更一般化。
程序中主要涉及到几个角色:
1、抽象构件角色: Component接口
2、树枝角色:Composite类
3、 树叶角色:Leaf 类
4、 测试客户端

package com;/** * @author Roger * 组合模式中对象和对象容器都实现该接口,使得用户使用时不需要区分对象和对象容器,方便使用 * 透明模式 * */public interface Component {public void add(Component c);public void remove(Component c);public void display();public Component getChild(int index);}

package com;import java.util.ArrayList;/** * @author Roger * 对象容器类 * */public class Composite implements Component{private ArrayList<Component> folder;private String name ;public Composite(String name) {super();this.folder = new ArrayList<Component>();this.name = name;}@Overridepublic void add(Component c) {// TODO Auto-generated method stubthis.folder.add(c);}@Overridepublic void remove(Component c) {// TODO Auto-generated method stubthis.folder.remove(c);}@Overridepublic void display() {// TODO Auto-generated method stubSystem.out.println("----"+this.name);for (int i = 0; i < this.folder.size(); i++) {this.folder.get(i).display();}}@Overridepublic Component getChild(int index) {// TODO Auto-generated method stubif (index>this.folder.size()) {return null;}return this.folder.get(index);}}

package com;public class Leaf implements Component{private String name;public Leaf(String name) {super();this.name = name;}@Overridepublic void add(Component c) {// TODO Auto-generated method stubSystem.out.println("Leaf.add() not supported ");}@Overridepublic void remove(Component c) {// TODO Auto-generated method stubSystem.out.println("Leaf.remove() not supported");}@Overridepublic void display() {// TODO Auto-generated method stubSystem.out.println("------------"+this.name);}@Overridepublic Component getChild(int index) {// TODO Auto-generated method stubSystem.out.println("Leaf.getChild() not supported");return null;}}

package com;/** * @author Roger * 组合模式: 文件、文件夹的管理 *  * 1,用户不需要知道使用的对象是简单对象还是对象容器 * 2,增加、删除很方便 *  * 适用场合: * 1、部分-整体层次结构 * 2、你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。 * */public class Client {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubComponent root = new Composite("root");Component c = new Composite("c");Component file1 = new Leaf("file1");Component file2 = new Leaf("file2");c.add(file1);c.add(file2);root.add(c);Component d = new Composite("d");Component file3 = new Leaf("file3");Component file4 = new Leaf("file4");d.add(file3);d.add(file4);root.add(d);root.display();//c.display();//root.getChild(1).display();//file1.display();//file1.getChild(0);}}

运行结果:
----root----c------------file1------------file2----d------------file3------------file4



0 0
原创粉丝点击