`

组合模式-------树形模式

阅读更多

1、组合模式定义

      组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构。它使得用户对单个对象的使用和组合对象的使用具有一致性。组合模式又叫做树形模式。其在项目开发中涉及树的结构都会想到组合模式。

2、组合模式的类图



 3、组合模式分类

组合模式分为透明方式和安全方式。

      透明模式是在Component类中声明对象的所有方法。叶子类和组合类都继承该类,使得叶子类和组合类都具有component中的所有方法。这样,叶子类和组合类对外界没有区别,它们具有完全一致的行为接口。但叶子类实现的诸如add、remove的方法显然是无意义的。



 

     安全模式是componet中只声明叶子类和组合类的公共方法。在组合类中声明自己的管理子类的方法。由于叶子类和子类不具备统一的接口,在操作调用过程中要不断判断,给用户带来诸多的不便。



 

4、组合模式的应用

      当需求要求体现部分与整体的层次结构,而又使用户可忽略组合对象和单个对象的不同,统一运用组合结构中的对象时,采用组合模式。

 5、组合模式的优缺点

组合模式可以使用户统一地对待单个对象和组合对象,使用单个对象的地方就可使用组合对象。但客户端调用时因为直接调用了单个对象和组合对象,因此耦合性比较紧,需要单个对象和组合对象的结构相对比较稳定,不易发生变化时才使用该模式。

6、组合模式的典型应用 组件树结构的信息

 

package com.cvicse.component;

/**
 * @author Administrator
 *
 */
public abstract class  Component {
	//名字
	private String name;
	//职位
	private String position;
	//工资
	private int salary;
	//构造函数
	public Component(String name,String position,int salary){
		this.name=name;
		this.position=position;
		this.salary=salary;
	}
	//获取员工信息
	public String getInfor(){
		String info = "";
		info = "姓名:" + this.name;
		info = info + "\t职位:"+ this.position;
		info = info + "\t薪水:" + this.salary;
		return info;
	}
}

 

package com.cvicse.component;

public class Leaf extends Component {

	public Leaf(String name, String position, int salary) {
		super(name, position, salary);
	}
}

 

package com.cvicse.component;

import java.util.ArrayList;

public class Composite extends Component {
	//领导下边有那些下级领导和小兵
	private ArrayList<Component> subordinateList = new ArrayList<Component>();

	public Composite(String name, String position, int salary) {
		super(name, position, salary);
	}
	//增加一个下属,可能是小头目,也可能是个小兵
	public void addSubordinate(Component component) {
	this.subordinateList.add(component);
	}
	//我有哪些下属
	public ArrayList<Component> getSubordinate() {
	return this.subordinateList;
	}
}

 

package com.cvicse.component;

import java.util.ArrayList;

public class Client {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//首先是组装一个组织结构出来
		Composite ceo = compositeCorpTree();
		//首先把CEO的信息打印出来:
		System.out.println(ceo.getInfor());
		//然后是所有员工信息
		System.out.println(getTreeInfo(ceo));
	}

	// 把整个树组装出来
	public static Composite compositeCorpTree() {
		// 首先产生总经理CEO
		Composite root = new Composite("王雷", "总经理", 100000);
		// 把三个部门经理产生出来
		Composite developDep = new Composite("刘鑫", "研发部门经理", 10000);
		Composite salesDep = new Composite("马明", "销售部门经理", 20000);
		Composite financeDep = new Composite("赵岩", "财务部经理", 30000);
		// 再把三个小组长产生出来
		Composite firstDevGroup = new Composite("杨辉", "开发一组组长", 5000);
		Composite secondDevGroup = new Composite("吴起", "开发二组组长", 6000);
		// 把所有的小兵都产生出来
		Leaf a = new Leaf("a", "开发人员", 2000);
		Leaf b = new Leaf("b", "开发人员", 2000);
		Leaf c = new Leaf("c", "开发人员", 2000);
		Leaf d = new Leaf("d", "开发人员", 2000);
		Leaf e = new Leaf("e", "开发人员", 2000);
		Leaf f = new Leaf("f", "开发人员", 2000);
		Leaf g = new Leaf("g", "开发人员", 2000);
		Leaf h = new Leaf("h", "销售人员", 5000);
		Leaf i = new Leaf("i", "销售人员", 4000);
		Leaf j = new Leaf("j", "财务人员", 5000);
		Leaf k = new Leaf("k", "CEO秘书", 8000);
		Leaf zhengLaoLiu = new Leaf("郑剑", "研发部副经理", 20000);
		// 开始组装
		// CEO下有三个部门经理和一个秘书
		root.addSubordinate(k);
		root.addSubordinate(developDep);
		root.addSubordinate(salesDep);
		root.addSubordinate(financeDep);
		// 研发部经理
		developDep.addSubordinate(zhengLaoLiu);
		developDep.addSubordinate(firstDevGroup);
		developDep.addSubordinate(secondDevGroup);
		// 看看开发两个开发小组下有什么
		firstDevGroup.addSubordinate(a);
		firstDevGroup.addSubordinate(b);
		firstDevGroup.addSubordinate(c);
		secondDevGroup.addSubordinate(d);
		secondDevGroup.addSubordinate(e);
		secondDevGroup.addSubordinate(f);
		// 再看销售部下的人员情况
		salesDep.addSubordinate(h);
		salesDep.addSubordinate(i);
		// 最后一个财务
		financeDep.addSubordinate(j);
		return root;
	}

	// 遍历整棵树,只要给我根节点,我就能遍历出所有的节点
	public static String getTreeInfo(Composite root) {
		ArrayList<Component> subordinateList = root.getSubordinate();
		String info = "";
		for (Component s : subordinateList) {
			if (s instanceof Leaf) { // 是员工就直接获得信息
				info = info + s.getInfor() + "\n";
			} else { // 是个小头目
				info = info + s.getInfor() + "\n" + getTreeInfo((Composite) s);
			}
		}
		return info;
	}
}

 运行结果;

姓名:王雷 职位:总经理 薪水:100000
姓名:k 职位:CEO秘书 薪水:8000
姓名:刘鑫 职位:研发部门经理 薪水:10000
姓名:郑剑 职位:研发部副经理 薪水:20000
姓名:杨辉 职位:开发一组组长 薪水:5000
姓名:a 职位:开发人员 薪水:2000
姓名:b 职位:开发人员 薪水:2000
姓名:c 职位:开发人员 薪水:2000
姓名:吴起 职位:开发二组组长 薪水:6000
姓名:d 职位:开发人员 薪水:2000
姓名:e 职位:开发人员 薪水:2000
姓名:f 职位:开发人员 薪水:2000
姓名:马明 职位:销售部门经理 薪水:20000
姓名:h 职位:销售人员 薪水:5000
姓名:i 职位:销售人员 薪水:4000
姓名:赵岩 职位:财务部经理 薪水:30000
姓名:j 职位:财务人员 薪水:5000

 

  • 大小: 61.7 KB
  • 大小: 32.2 KB
  • 大小: 25.6 KB
分享到:
评论
1 楼 moonbeach 2012-01-10  
2009年的文章还是回下,
楼主这个例子对象间的组合关系是没什么问题,但关键的operation方法放在了Client.getTreeInfo()这个地方,就把组合的构建暴露给外部使用了,不合适

相关推荐

    组合模式-空军指挥系统.zip

    组合模式是一种对象结构型设计模式,它允许我们创建表示部分-整体层次结构的树形对象。在空军指挥系统中,这种模式的应用可以帮助我们构建一个灵活、可扩展的组织架构,其中每个部分(如飞机、飞行编队或基地)都...

    组合模式-五子棋代码.zip

    组合模式是一种对象结构型设计模式,它允许我们以树形结构来表示部分-整体关系,使得我们可以像处理单个对象一样处理整个集合。在五子棋游戏的实现中,组合模式的应用尤为关键,因为它帮助我们将棋盘上的棋子和棋盘...

    java常用设计模式-组合模式

    组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中,有两种基本类型的对象:叶...

    设计模式专题之(九)组合模式---设计模式组合模式示例代码(python--c++)

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们可以在统一的接口下处理单个对象和对象的组合。这个模式在处理类似目录树或者组织架构这样的数据时非常有用。在组合模式中,...

    2 组合模式-课程内容.rar

    组合模式是一种设计模式,它属于行为设计模式,主要用于将对象组织成树形结构,使得用户可以对单个对象和组合对象进行一致的操作。这个模式在处理具有部分整体关系的复杂对象时特别有用,例如文件系统、菜单结构或者...

    设计模式-组合模式

    组合模式是一种软件设计模式,属于结构型模式,它允许我们以树形结构来表示部分与整体的关系,使得我们可以像处理单个对象一样处理整个集合。在iOS开发中,这种模式非常有用,特别是在处理数据结构或者UI组件时,...

    设计模式--组合模式java例子

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体关系,使得我们能够像处理单个对象一样处理整个集合。在Java中,这种模式的应用可以帮助我们简化对复杂对象层次结构的操作,同时保持接口的...

    Python 程序语言设计模式思路-结构型模式:组合模式:将对象组合成树形结构

    组合模式作为一种强大的设计模式,通过将对象组合成树形结构,可以表示“部分-整体”的层次结构,并统一地处理单个对象和组合对象,简化了客户端代码的复杂性,从而提高代码的灵活性和可扩展性。在实际开发中,它在...

    2 组合模式-MOOC课程内容.pdf

    以Employee类的树形结构为例,可以说明组合模式的应用。在这个例子中,每个Employee对象可以是一个叶子节点(没有下属的员工),也可以是一个组合节点(有下属的员工,如部门经理或CEO)。该结构允许以统一的方式...

    设计模式-组合模式(讲解及其实现代码)

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们能够以统一的方式来处理单个对象和对象的组合。在组合模式中,单个对象和组合对象都被视为同一类型,这使得客户端代码可以对...

    设计模式-组合实体

    总结来说,设计模式-组合实体是软件开发中的一个重要工具,尤其是在iOS开发中,它可以帮助我们构建模块化、可扩展的代码结构,使代码更易于理解和维护。通过理解并熟练运用组合实体模式,开发者能够更高效地处理复杂...

    设计模式实验报告-组合模式.docx

    组合模式(Composite Pattern)是一种结构型设计模式,它允许用户将对象组合成树形结构来表示部分-整体层次结构。该模式使得用户对单个对象和组合对象的使用具有一致性。 #### 实验内容 实验内容主要包括设计和实现...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。 - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。 - 享元模式(Flyweight):使用共享对象,有效地支持大量细...

    c#代码介绍23种设计模式-10组合模式(附代码)

    组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合 组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。这就是组合模式能够...

    设计模式_组合模式.zip

    组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过...

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

    组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...

    Java设计模式----通俗易懂版

    - 组合模式:允许你将对象组合成树形结构,表现得像单个对象。 - 外观模式:提供一个简单的接口来访问复杂的子系统。 - 享元模式:通过共享技术有效支持大量细粒度的对象。 - 装饰模式:动态地给一个对象添加...

    设计模式之-----组合模式 java

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们能够以统一的方式来处理单个对象和对象的组合。在Java中,组合模式的应用可以帮助我们构建灵活、易于维护的代码。 首先,...

    Java 23种设计模式12组合模式.pdf

    组合模式是一种结构型设计模式,主要用于处理树形结构中的对象集合问题。通过这种模式,我们可以将多个对象组织成树形结构来表示“整体-部分”的层级关系,并允许客户以一致的方式处理单个对象(叶子对象)和复合...

Global site tag (gtag.js) - Google Analytics