`

8、组合模式

 
阅读更多

 组合模式

1、组合模式

组合模式属于对象中的结构模式,有时又叫做部分-整体模式。合成模式是将部分和整体的关系用树结构表示出来。

2、结构

 

 

以上类图结构涉及三种角色:

抽象构件角色:这是一个抽象角色,它给参加组合的对象规定一个接口,这个角色给出共有的接口和默认行为。

树叶构件角色:代表参加组合的树叶对象。

树枝构件角色:代表参加组合的有子对象的对象,并给出树枝构件对象的行为。

 

3、代码

以下是描述一个公司层次结构的实例

抽象构件角色company

public abstract class Company {
	
	public Company() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Company(String name, int dep) {
		super();
		this.name = name;
		this.dep = dep;
	}

	private String name;
	
	private int dep = 0;
	
	public Company add(Company company){
		
		return this;
	}
	
	public Company remove(Company company){
		
		return this;
	}
	
	public void operate(){
		for(int i = 0; i < dep; i++){
			System.out.print("-");
		}
		System.out.println(this.name);
	}

	public String getName() {
		return name;
	}

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

	public int getDep() {
		return dep;
	}

	public void setDep(int dep) {
		this.dep = dep;
	}
	
	public abstract List<Company> getComposite();
	
}

 

树叶构件角色LeafCompany

public class LeafCompany extends Company {
	
	public LeafCompany() {
		super();
	}

	public LeafCompany(String name, int dep) {
		super(name, dep);
	}

	@Override
	public List<Company> getComposite() {
		return null;
	}

}

 

树枝就、构件角色CompositeCompany

public class CompositeCompany extends Company {

	private List<Company> composite = new ArrayList<Company>();
	
	public CompositeCompany(String name, int dep) {
		super();
		this.setName(name);
		this.setDep(dep);
	}
	
	public CompositeCompany(String name) {
		super();
		this.setName(name);
	}

	@Override
	public Company add(Company company) {
		if(company.getDep() == 0){
			company.setDep(this.getDep()+1);
		}
		composite.add(company);
		return super.add(company);
	}

	@Override
	public Company remove(Company company) {
		composite.remove(company);
		return super.remove(company);
	}

	@Override
	public void operate() {
		display(this);
	}

	private void display(Company company){
		out(company);
		if(company.getComposite() != null && company.getComposite() .size() != 0){
			for(int i = 0; i < company.getComposite().size(); i++){
				display(company.getComposite().get(i));
			}
		}
	}
	
	private void out(Company company){
		for(int i = 0; i < company.getDep(); i++){
			System.out.print("-");
		}
		System.out.println(company.getName()+"("+company.getDep()+")");
	}

	public List<Company> getComposite() {
		return composite;
	}

	public void setComposite(List<Company> composite) {
		this.composite = composite;
	}
	
	
}

 

 

客户端测试程序Client

public class Client {
	
	public static void main(String[] args) {
		
		Company root = new CompositeCompany("北京总部",0);
		
		CompositeCompany child1 = new CompositeCompany("杭州分部",1);
//		CompositeCompany child11 = new CompositeCompany("杭州分部1",2);
		Company child11 = new LeafCompany("杭州分部1",2);
		
		CompositeCompany child2 = new CompositeCompany("上海分部",1);
//		CompositeCompany child21 = new CompositeCompany("上海分部1",2);
		Company child21 = new LeafCompany("上海分部1",2);
		
		
		child1.add(child11);
		child2.add(child21);
		root.add(child1);
		root.add(child2);
		
		
		root.operate();
	}

}

 

 

4、总结

 

组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。

 

如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相同的接口,你就可以用相同的方式对待文件和目录,从而实现将文件或者目录储存为目录的子级元素。
  • 大小: 4 KB
分享到:
评论

相关推荐

    8 组合模式.txt

    8 组合模式.txt

    《C++20设计模式》学习笔记-第8章组合模式-配套学习代码

    《C++20设计模式》学习笔记-第8章组合模式-配套学习代码

    lua设计模式总结

    5、组合模式lua实现 6、桥接模式lua实现 7、享元模式lua实现 行为模式 1、策略模式lua实现 2、模板方法模式lua实现 3、观察者模式lua实现 4、状态模式lua实现 5、迭代器模式lua实现 6、备忘录模式lua实现 7、命令...

    精品源码 C# 27种设计模式源代码

    3 组合模式 4 抽象工厂模式 4 代理模式 4 命令模式 5 迭代器模式 5 适配器模式 5 原型模式 6 简单工厂模式 6 解释器模式 6 享元模式 7 桥接模式 7 状态模式 8 结构型模式总结 8 责任链模式 9 创建型模式总结 9 中介...

    java设计模式

    21.3.4 组合模式的注意事项 21.4 组合模式的扩展 21.4.1 真实的组合模式 21.4.2 透明的组合模式 21.4.3 组合模式的遍历 21.5 最佳实践 第22章 观察者模式 22.1 韩非子身边的卧底是谁派来的 22.2 观察者模式的定义 ...

    java23种设计模式

    011组合模式8 \7 e- [% }# B5 p2 S 012状态模式 M% S6 a. `. h# h! h. F 013代理模式8 g( r/ i6 W3 q9 z; ~$ O 014复合模式 015桥接模式 016生成器模式 017责任链模式 018蝇量模式 019解释器模式 020中介者模式 021...

    C#设计模式_设计模式_C#_

    组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 行为型: 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代器...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    组合模式(Composite Pattern)-结构型模式 (0%) &lt;br&gt;讲义书写模式 在实际的讲解中我会用一套模式来讲述我对设计模式的理解 1.给出当前章节模式的名称 2.讲述一个小故事,提出问题 3.回答这个...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式

    设计模式_源代码大全.zip

    组合模式 16.迭代器模式 17.单例模式 18.桥接模式 19.命令模式 20.职责链模式 21.中介者模式 22.享元模式 23.解释器模式 24.访问者模式 ... 相关资料:https://download.csdn.net/download/djk8888/11189309 和 ...

    C#设计模式(23种设计模式)

    组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代...

    Python设计模式之组合模式原理与用法实例分析

    本文实例讲述了Python设计模式之组合模式原理与用法。分享给大家供大家参考,具体如下: 组合模式(Composite Pattern):将对象组合成成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象...

    设计模式所有实验及实验报告及代码.zip

    24组合模式 25行为型模式概述 26模板方法模式 27策略模式 28命令模式 29责任链模式 30状态模式 31观察者模式 32中介者模式 33迭代器模式 34访问者模式 35备忘录模式 36解释器模式 37UMLet的使用与类图的设计 38创建...

    head first 设计模式

    高清中文版 引子 1 设计模式入门 欢迎来到设计模式世界 ...9 选代器与组合模式 管理良好的集合 10 状态模式 事物的状态 11 代理模式 控制对象访问 12 复合模式 模式中的模型 13 与设计模式相处 真实世界中的模式

    深入浅出java设计模式(高清中文PDF)

    组合模式 8.装饰模式 9.门面模式 10.享元模式 11.代理模式 12.责任链模式 13.命令模式 14.解释器模式 15.迭代器模式 16.调停者模式 17.备忘录模式 18.观察者模式 19.策略模式 20.状态模式 21.模板模式...

    32种设计模式

    组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command ...

    ActionScript 3.0设计模式扫描版_方红琴译

    组合模式中关键的OOP概念 实例:歌曲播放列表 实例:利用反向运动学制作组合对象的动画效果 使用Flash内置的组合结构:显示列表 小结 第Ⅳ部分 行为模式 第7章 命令模式 什么是命令模式? 命令模式的最小化...

    尚硅谷设计模式源码笔记课件.zip

    结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、...

    Head First设计模式 中文 高清

    目录(真正的目录) 引子 1 设计模式入门 欢迎来到设计模式世界 ...9 选代器与组合模式 管理良好的集合 10 状态模式 事物的状态 11 代理模式 控制对象访问 12 复合模式 模式中的模型 13 与设计模式相处 真实世界中的模式

    开机F8后进入"安全模式"有什么用,你知道多少?

    8.调试模式 启动时通过串行电缆将调试信息发送到另一台计算机。 如果正在或已经使用远程安装服务在您的计算机上安装 Windows,则您可以看到与使用远程安装服务还原或恢复系统相关的附加选项。 现实应用

Global site tag (gtag.js) - Google Analytics