`
zy19982004
  • 浏览: 661823 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:251950
社区版块
存档分类
最新评论

设计模式学习十二:组合模式

阅读更多

一.概念

     组合模式允许你将对象组合成树形结构来表现"整体/部分"层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

 

二.UML

  1. Component(对象接口),定义了对象可以做的事情。
  2. Leaf(叶子结点对象)。
  3. Composite(其它结点对象)。

三.实例分析

     网上购物的时候,我们会发现,快递时一层一层下来的,我在北京朝阳区六里屯街道买了一个东西,物品会依次经过六里屯街道-朝阳区-深圳-深圳南山这样的顺序邮寄到我手里。我们可以看出,每个地区都会有一个大的投递点,然后再往下细分。从中,我抽象了这么几个类。说明:顺丰快递总公司实际在深圳,但为了更清楚的说明组合模式,我将"顺丰公司"放在了一个更高的层次。

 

 

     SFCompany

package com.zzy.composite;

/**
 * 顺丰公司抽象类
 * 定义了公司可以做哪些事情
 * @author eason
 *
 */
public abstract class SFCompany {
	
	//公司名
	protected String name;
	//公司级别
	protected int grade;
	
	public SFCompany(String name, int grade) {
		this.name = name;
		this.grade = grade;
	}
	
	//添加一个下属公司
	public abstract void add(SFCompany sf);
	//删除一个下属公司
	public abstract void remove(SFCompany sf);
	//打印自己
	public void display() {
		for(int i=1; i<=grade; i++) {
			System.out.print("-----");
		}
		System.out.println(name);
	}
	
}
 

     SFTailCompany

package com.zzy.composite;


/**
 * 最下层的公司
 * @author eason
 *
 */
public class SFTailCompany extends SFCompany{
	
	public SFTailCompany(String name, int grade) {
		super(name, grade);
	}

	@Override
	public void add(SFCompany sf) {
		throw new UnsupportedOperationException();
	}

	@Override
	public void remove(SFCompany sf) {
		throw new UnsupportedOperationException();
	}
	
//  已经提到父类中
//	@Override
//	public void display() {
//		for(int i=1; i<=grade; i++) {
//			System.out.print("-----");
//		}
//		System.out.println(name);
//	}
}
 

     SFHeadCompany

package com.zzy.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 有下属公司的顺丰公司
 * @author eason
 *
 */
public class SFHeadCompany extends SFCompany{
	//保存下属公司
	private List<SFCompany> sfCompanys = new ArrayList<SFCompany>();
	
	public SFHeadCompany(String name, int grade) {
		super(name, grade);
	}

	@Override
	public void add(SFCompany sf) {
		sfCompanys.add(sf);
	}

	@Override
	public void remove(SFCompany sf) {
		sfCompanys.remove(sf);
	}

	//先打印自己,在打印自己的下属
	@Override
	public void display() {
//  已经提到父类中,用super.display();代替
//		for(int i=1; i<=grade; i++) {
//			System.out.print("-----");
//		}
//		System.out.println(name);
		super.display();
		for(SFCompany sf : sfCompanys) {
			sf.display();
		}
	}

}
 

     TestCompostite

package com.zzy.composite;

/**
 * 测试类
 * @author eason
 *
 */
public class TestCompostite {

	public static void main(String[] args) {
		SFCompany head = new SFHeadCompany("总公司", 1);
		SFCompany shenzhen = new SFHeadCompany("深圳分公司", 2);
		SFCompany wuhan = new SFHeadCompany("武汉分公司", 2);
		SFCompany beijing = new SFHeadCompany("北京分公司", 2);
		SFCompany wuchang = new SFHeadCompany("武昌分公司", 3);
		SFCompany baoan = new SFHeadCompany("宝安分公司", 3);
		SFCompany luohu = new SFHeadCompany("罗湖分公司", 3);
		SFCompany nanshan = new SFHeadCompany("南山分公司", 3);
		
		head.add(shenzhen);
		head.add(wuhan);
		head.add(beijing);
		
		wuhan.add(wuchang);
		
		shenzhen.add(baoan);
		shenzhen.add(luohu);
		shenzhen.add(nanshan);
		//移除武汉
		//head.remove(wuhan);
		
		head.display();
		
	}

}

     其结果如下:移除武汉是左图

    

 

四.使用场景及使用感受

  1. 需求中体现的是整体和部分的层次关系,以及用户希望忽略整体与部分的不同,统一的使用整体对象和部分对象时,就应该考虑组合模式。
  2. 组合模式让你可以优化处理递归或分级数据结构。如文件系统结构。

 

public static void showDetails(File f) {
		//如果是目录
		if(f.isDirectory()){
			//拿到跟目录下所有文件,迭代后递归
			File[] files = f.listFiles();
			for(File file : files) {
				showDetails(file);
			}
		//如果是文件,打印
		}else {
			System.out.println(f.getAbsolutePath());
		}
	}
0
0
分享到:
评论

相关推荐

    设计模式的杰作:深入设计模式

    - **为什么以及如何学习设计模式**:了解设计模式有助于提高代码质量,增强代码的可读性和可维护性。通过学习设计模式,开发者可以更好地理解软件架构,并能够快速地适应新的项目需求。 #### 软件设计原则 《深入...

    设计模式学习报告

    ### 设计模式学习报告 #### 一、设计模式概述 设计模式是一种被广泛接受和使用的编程解决方案,旨在解决软件设计中的常见问题。它不仅能够帮助开发者编写出更易于理解和维护的代码,还能够促进代码的复用性。设计...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    《设计模式:可复用面向对象软件的基础》一书介绍了23种经典的设计模式,这些模式大致可以分为三大类: 1. **创建型模式**:专注于对象的创建机制,确保系统在合适的时机创建正确的对象。 - **单例模式**...

    设计模式:可复用面向对象软件的基础.zip

    通过学习和掌握这些设计模式,开发者可以更好地理解和应用面向对象的设计原则,如单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则。这些原则和模式的结合,可以帮助我们构建出更加模块化、可扩展...

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    《设计模式:可复用面向对象软件的基础》英文版

    本书主要面向已经具备一定面向对象编程基础的读者,旨在通过一系列设计模式的学习,提升读者在实际项目中的设计能力。 #### 核心内容解析 ##### 什么是设计模式? 设计模式是针对软件设计中出现的常见问题而提出...

    23种设计模式(C++).pdf

    《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》是一本深入探讨软件设计模式的书籍,它涵盖了创建型、结构型和行为...通过学习和应用这些设计模式,开发者可以更好地设计出高质量、易于维护和扩展的软件系统。

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    设计模式的学习过程通常分为四个阶段:学习、表达、教授、记录。每个阶段都需要不同的技能和深度的理解。 #### 0.2 设计模式解析后记 在完成所有设计模式的学习和解析之后,开发者会发现自己已经进入了一个新的...

    设计模式学习 ppt

    这个“设计模式学习ppt”资料包显然是一份面向初学者或大学生的教学资源,通过十四个PPT文件深入浅出地讲解了设计模式的各个方面。 首先,我们来看设计模式的基本概念。设计模式是对在特定上下文中反复出现的问题...

    java之23种设计模式完整代码

    这些设计模式的代码示例对于Java开发者来说,是非常宝贵的学习材料。通过实践这些代码,你可以深入了解每种模式的实现细节,了解它们如何提高代码的可扩展性和可维护性。同时,对比不同模式的应用,可以帮助你更好地...

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    设计模式C++学习之组合模式(Composite)

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体关系,使得我们能够以统一的方式处理单个对象和对象集合。在C++中,组合模式的应用可以帮助我们构建灵活且易于操作的对象层次结构,使得客户端...

    GOF23种设计模式

    GOF(GoF)23种设计模式,是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大神在他们的著作《设计模式:可复用面向对象软件的基础》中提出的,这些模式分为创建型、结构型和行为型三大类。...

    设计模式学习笔记大全

    以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...

    head first设计模式学习代码

    《Head First设计模式学习代码详解》 设计模式是软件工程中的宝贵经验总结,它提供了一套通用的解决方案模板,帮助开发者在面对复杂问题时能够快速有效地进行设计和开发。Head First设计模式是一本非常受欢迎的设计...

    java设计模式学习笔记,以及各种模式的代码实现

    11. **组合模式**:允许你将对象组织成树形结构来表现“整体-部分”关系,同时可以像单个对象那样操作整个组合。 12. **享元模式**:运用共享技术有效地支持大量细粒度的对象,减少内存开销。 13. **模板方法模式*...

Global site tag (gtag.js) - Google Analytics