`
zzq19860626
  • 浏览: 264491 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
B20df9e2-fb3d-3644-9f72-c1619842f682
设计模式学习笔记
浏览量:180039
87eaf24f-812a-3463-8e65-e3197d2ad8c2
java虚拟机
浏览量:26623
社区版块
存档分类
最新评论

JAVA设计模式学习10——组合模式

阅读更多
这节开始学习结构模式,结构模式包括:组合模式、门面模式、适配器模式、代理模式、装饰模式、桥模式、享元模式。从组合模式开始学习。

组合模式(Composite)就是把部分和整体的关系用树形的结构来表示,从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。

树图结构一般包含一个根节点,若干个树枝和叶子节点。如下图:

可以用一个类图描述树结构的静态结构,把根节点当做树枝节点来描述,同时和叶子节点具有共同的父类:

树结构的类图,其实就是组合模式的简略类图,最上面为抽象节点,左下方为叶子节点,右下方为树枝节点,它含有其他的节点。

通过以上结构图可以看出,组合模式有以下角色:

1、抽象构建角色(component):作为抽象角色,给组合对象的统一接口。

2、树叶构建角色(leaf):代表组合对象中的树叶对象。

3、树枝构建角色(composite):参加组合的所有子对象的对象,并给出树枝构构建对象的行为。

组合模式在现实中使用很常见,比如文件系统中目录和文件的组成,算式运算,android里面的view和viewgroup等控件,淘宝产品分类信息的展示等都是组合模式的例子。还有个故事:从前山里有座庙,庙里有个老和尚,老和尚对象小和尚讲故事说,从前山里有个庙......退出循环的条件是听厌烦了,或者讲的人讲累了。

这个模式的举例最多的是公司员工的例子。我们这里也以故事雇员为例子来描述:



 

 

package composite;
/**
 * 
 *作者:alaric
 *时间:2013-7-20下午5:11:41
 *描述:员工和领导的统一接口
 */
public interface Worker {
	
	public void doSomething();

}

 

package composite;
/**
 * 
 *作者:alaric
 *时间:2013-7-20下午5:59:11
 *描述:普通员工类
 */
public class Employe implements Worker {

	private String name;
	
	public Employe(String name) {
		super();
		this.name = name;
	}
	@Override
	public void doSomething() {
		System.out.println(toString());
	}


	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "我叫"+getName()+",就一普通员工!";
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}	

}

 

package composite;

import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 
 *作者:alaric
 *时间:2013-7-20下午5:14:50
 *描述:领导类
 */
public class Leader implements Worker {
	private List<Worker> workers = new CopyOnWriteArrayList<Worker>();  
	private String name;
	
	public Leader(String name) {
		super();
		this.name = name;
	}
	public void add(Worker worker){
		workers.add(worker);
	}
	
	public void remove(Worker worker){
		workers.remove(worker);
	}
	
	public Worker getChild(int i){
		return workers.get(i);
	}
	@Override
	public void doSomething() {
		System.out.println(toString());
		Iterator<Worker> it = workers.iterator();
		while(it.hasNext()){
			it.next().doSomething();
		}
			
	}

	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "我叫"+getName()+", 我是一个领导,有 "+workers.size()+"下属。";
	}
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

 

package composite;
/**
 * 
 *作者:alaric
 *时间:2013-7-20下午5:49:37
 *描述:测试类
 */
public class Client {

	/**
	 *作者:alaric
	 *时间:2013-7-20下午5:49:32
	 *描述:
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Leader leader1 = new Leader("张三");
		Leader leader2 = new Leader("李四");
		Employe employe1 = new Employe("王五");
		Employe employe2 = new Employe("赵六");
		Employe employe3 = new Employe("陈七");
		Employe employe4 = new Employe("徐八");
		leader1.add(leader2);
		leader1.add(employe1);
		leader1.add(employe2);
		leader2.add(employe3);
		leader2.add(employe4);
		leader1.doSomething();
		
	}

 运行结果如下:

我叫张三, 我是一个领导,有 3个直接下属。

我叫李四, 我是一个领导,有 2个直接下属。

我叫陈七,就一普通员工!

我叫徐八,就一普通员工!

我叫王五,就一普通员工!

我叫赵六,就一普通员工!

上面员工关系的的树形结构如下:


上面例子给出的组合模式抽象角色里,并没有管理子节点的方法,而是在树枝构建角色,这种模式使得叶子构建角色和树枝构建角色有区分,客户端要分别对待树叶构建角色和树枝构建角色,好处是客户端对叶子节点不会调用管理的方法,当调用时,在编译时就会报错,所以也称安全模式。相对安全模式,还有一种透明模式,就是在抽象角色里面添加管理方法,如下图:


这种做法是对客户端来说叶子和树枝都是一致的接口,相对透明,但是叶子节点在调用管理方法是编译时不会报错,运行时才报错,所以不够安全。两种做法均有利弊,使用时要根据具体情况而权衡。

 

 

设计模式系列目录:

JAVA设计模式学习1——统一建模语言UML

JAVA设计模式学习2——面向对象设计原则

JAVA设计模式学习3——设计模式概述

JAVA设计模式学习4——简单工厂模式

JAVA设计模式学习5——工厂方法模式

JAVA设计模式学习6——抽象工厂模式

JAVA设计模式学习7——单例模式

JAVA设计模式学习8——建造模式

JAVA设计模式学习9——原型模式

JAVA设计模式学习10——组合模式

JAVA设计模式学习11——适配器模式

JAVA设计模式学习12——装饰器模式

JAVA设计模式学习13——代理模式

JAVA设计模式学习14——享元模式

JAVA设计模式学习15——门面模式

JAVA设计模式学习16——桥梁模式

JAVA设计模式学习17——策略模式

JAVA设计模式学习18——模版方法模式

JAVA设计模式学习19——观察者模式

JAVA设计模式学习20——责任链模式

JAVA设计模式学习21——命令模式

JAVA设计模式学习22——备忘录模式

JAVA设计模式学习23——状态模式

JAVA设计模式学习24——访问者模式

JAVA设计模式学习25——迭代器模式

 
  • 大小: 6.1 KB
  • 大小: 3.4 KB
  • 大小: 14.6 KB
  • 大小: 5 KB
  • 大小: 18.8 KB
2
0
分享到:
评论
8 楼 cwqcwqmax9 2013-09-10  
@zzq19860626  谢谢 您的回复 ,我明白了   
7 楼 zzq19860626 2013-09-06  
cwqcwqmax9 写道
我不明白的是组合模式(Composite) 它的  定义 :就是把部分和整体的关系用树形的结构来表示,从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。

   客户端能够把部分对象和组合起来的对象采用同样的方式来看待

   与

   部分和整体的关系用树形的结构来表示  

   之间并不存在必然性。

本身这句话就有问题

什么问题?
6 楼 zzq19860626 2013-09-06  
cwqcwqmax9 写道
如果 按照定义  如下也是  组合模式

       

                 





树形 似乎不只是你上图的那么一种吧

你这个确实是组合模式啊,所有能用树表示的都能用组合模式。
5 楼 cwqcwqmax9 2013-09-05  
我不明白的是组合模式(Composite) 它的  定义 :就是把部分和整体的关系用树形的结构来表示,从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。


   客户端能够把部分对象和组合起来的对象采用同样的方式来看待


   与

   部分和整体的关系用树形的结构来表示  

   之间并不存在必然性。



本身这句话就有问题
4 楼 cwqcwqmax9 2013-09-05  
如果 按照定义  如下也是  组合模式

       

                 





树形 似乎不只是你上图的那么一种吧
3 楼 cwqcwqmax9 2013-09-05  
如果 按照定义  如下也是  组合模式

       

                 





树形 似乎不只是你上图的那么一种吧
2 楼 zzq19860626 2013-09-03  
cwqcwqmax9 写道
我觉得  你后面说的不对 :
根据

组合模式(Composite)就是把部分和整体的关系用树形的结构来表示,从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。

这句话对 组合模式的定义来看,后面这句“客户端要分别对待树叶构建角色和树枝构建角色,好处是客户端对叶子节点不会调用管理的方法”  ,就与组合模式的运用相违背

是的的确有点区别,安全模式是不符合“从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。”这句的描述,但是在实际使用过程中,安全模式(透明模式)与非安全模式(非透明模式)都有使用的场合的,就当是组合模式的一个变种。
1 楼 cwqcwqmax9 2013-09-03  
我觉得  你后面说的不对 :
根据

组合模式(Composite)就是把部分和整体的关系用树形的结构来表示,从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。

这句话对 组合模式的定义来看,后面这句“客户端要分别对待树叶构建角色和树枝构建角色,好处是客户端对叶子节点不会调用管理的方法”  ,就与组合模式的运用相违背

相关推荐

    JAVA设计模式学习12——装饰器模式

    装饰器模式是面向对象设计模式的一种,主要用于在不改变原有对象结构的情况下,动态地为对象增加新的功能。这种模式在Java中尤其常见,因为它允许我们遵循“开闭原则”——对扩展开放,对修改关闭。 装饰器模式的...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    java23种设计模式——图解——附带源码

    以上两种创建型模式,即工厂方法模式和抽象工厂模式,是Java设计模式中非常重要的一部分,它们可以帮助开发者更好地管理对象的创建过程,提高系统的灵活性和可扩展性。接下来的部分将继续探讨其他的设计模式。

    java设计模式之——组合模式(结构型模式 )

    NULL 博文链接:https://lvwenwen.iteye.com/blog/1549415

    设计模式-Java语言中的应用(pdf)

    通过深入学习《设计模式——Java语言中的应用》,开发者能够更好地理解和应用这些模式,从而编写出更加高效、可扩展的Java程序。无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的...

    java设计模式之——策略模式

    在实际应用中,策略模式可以与其他设计模式结合使用,如工厂模式用于创建策略对象,或者使用组合模式来组织多个策略。同时,策略模式也可以用于替代继承,避免由于类的层次过多而导致的复杂性。 在阅读《Effective ...

    java设计模式经典教程

    ### Java设计模式经典教程知识点概览 #### 一、设计模式概述 设计模式是一种软件设计方法,它为软件开发者提供了一种标准化的方式去解决常见的软件设计问题。设计模式的使用可以提高代码的可读性和可维护性,同时...

    设计模式——建造者模式

    建造者模式是一种结构型设计模式,它允许我们分步骤创建复杂对象,而无需暴露构建过程的内部细节。这种模式在Java编程中非常常见,尤其是在处理需要多种构建方式或需要隔离对象构造过程的场景。 建造者模式的核心...

    浅析Java设计模式【2】——适配器

    ### 浅析Java设计模式【2】——适配器 #### 概念解析 适配器模式是一种常用的设计模式,其核心在于“适配”二字,即如何将一个类的接口转换成客户希望的另一个接口。该模式使得原本由于接口不兼容而不能一起工作的...

    Java设计模式精讲1

    总结来说,Java设计模式的学习是一条不断深化的过程,它从UML开始,到设计模式的具体分类和应用,再到软件设计原则的领悟,每一步都是提升个人技术能力的重要环节。通过不断的学习和实践,开发者能够成为一名更加...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    java 设计模式幽默解读

    "大牛解读Java设计模式.pdf"这本书籍,作为这个主题的载体,很可能是由资深专家撰写,用生动的语言和实例帮助读者理解抽象的设计概念,从而提升他们的编程技能。无论你是初学者还是有经验的开发者,都能从中受益匪浅...

    java设计模式(23种设计模式大全)

    根据提供的标题、描述以及部分内容,本文将深入探讨Java设计模式,并着重分析23种常见的设计模式,以帮助Java程序员更好地理解和应用这些模式。 ### Java设计模式概述 Java设计模式是面向对象软件设计的一种通用可...

    Java与模式(闫宏)

    《Java与模式》是闫宏大师的一部经典之作,它将古老的哲学智慧——道德经的智慧,巧妙地融入到现代编程语言Java的设计模式之中。这本书不仅深入浅出地讲解了23种经典的设计模式,还提供了丰富的实践案例,旨在帮助...

    java设计模式——告诉新手一些不知道的东西

    在编程世界中,Java设计模式是面向对象编程领域的一个重要概念,它为解决常见的软件设计问题提供了可重用的解决方案。对于新手来说,设计模式可能显得深奥难懂,但它们实际上是经验丰富的开发者用来提高代码质量、可...

    Java设计模式综合应用场景

    在这个实验报告中,主要讨论了三种设计模式——策略模式、装饰模式和工厂模式的综合运用,以解决一个国际电子商务系统的订单处理问题。 1. **策略模式**: 策略模式的核心在于将算法族封装在独立的可互换的策略类...

Global site tag (gtag.js) - Google Analytics