`

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

 
阅读更多
Composite模式定义:
        将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.

Composite模式理解:
        想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。

Composite模式好处:
        1.使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
        2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码

如何使用:
        Step 1:
        首先定义一个接口或抽象类(设计模式通用方式),其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体对象的方法.

        Step 2:
        以抽象类或接口的方式定义一个供继承或实现的类或接口:
       
import java.util.Iterator;

public abstract class Equipment {

	private String name;

	public Equipment(String name) {
		this.name = name;
	}

	// 实体价格
	public abstract double netPrice();

	// 折扣价格
	public abstract double discountPrice();

	// 增加部件的方法
	public boolean add(Equipment equipment) {
		return false;
	}

	// 移除部件方法
	public boolean remove(Equipment equipment) {
		return false;
	}

	// 组合体内访问各个部件的方法.
	public Iterator iter() {
		return null;
	}

}
        

        这个抽象类定义的就是一个组合体内所有对象都具有的共同方法和属性。

        Step 3:
        下面接着定义组合体内原件对象的实体类:
       
public class Disk extends Equipment {

	// 硬盘实体价格
	public static double diskNetPrice = 2.0;

	// 硬盘折扣价格
	public static double diskDiscountPrice = 1.0;

	public Disk(String name) {
		super(name);
	}

	@Override
	public double netPrice() {
		return diskNetPrice;
	}

	@Override
	public double discountPrice() {
		return diskDiscountPrice;
	}

}


        Disk是组合体内的一个对象,或称一个部件,这个部件是个单独元素( Primitive)。还有一种可能是,一个部件也是一个组合体,就是说这个部件下面还有'儿子',这是树形结构中通常的情况,应该比较容易理解。

        Step 4:
        现在我们在继续定义一个组合体:
       
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;

public abstract class CompositeEquipment extends Equipment {

	private int i = 0;

	// 定义一个List,用来保存组合体内的各个子对象.
	private List<Equipment> equipment = new ArrayList<Equipment>();

	public CompositeEquipment(String name) {
		super(name);
	}

	public boolean add(Equipment equipment) {
		if (equipment instanceof Disk && this instanceof Chassis) {
			System.out.println("在盘盒里面放了一个硬盘");
		} else if (equipment instanceof Chassis && this instanceof Cabinet) {
			System.out.println("在柜子里面放了一个盘盒");
		}
		this.equipment.add(equipment);
		return true;
	}

	public double netPrice() {
		double netPrice = 0.;
		if (this instanceof Cabinet) {
			System.out.println("我是在柜子的组合对象里面.柜子本身价格为:"
					+ Cabinet.cabinetNetPrice);
		} else if (this instanceof Chassis) {
			System.out.println("我是在盘盒的组合对象里面.盘盒本身价格为:"
					+ Chassis.chassisNetPrice);
		}
		Iterator<Equipment> iter = equipment.iterator();
		while (iter.hasNext()) {
			Equipment equipment = (Equipment) iter.next();
			if (equipment instanceof Chassis) {
				System.out.println("在柜子里面发现一个盘盒,计算它的价格");
			} else if (equipment instanceof Disk) {
				System.out.println("在盘盒里面发现一个硬盘,计算它的价格");
				System.out.println("硬盘本身价格为:" + Disk.diskNetPrice);
			}
			netPrice += equipment.netPrice();
		}
		return netPrice;
	}

	public double discountPrice() {
		double discountPrice = 0.;
		Iterator<Equipment> iter = equipment.iterator();
		while (iter.hasNext()) {
			discountPrice += ((Equipment) iter.next()).discountPrice();
		}
		return discountPrice;
	}

	// 这里提供用于访问自己组合体内的部件方法。
	// 上面Disk之所以没有,是因为Disk是个单独(Primitive)的元素.
	public Iterator iter() {
		return equipment.iterator();
	}

	// 重载Iterator方法
	public boolean hasNext() {
		return i < equipment.size();
	}

	// 重载Iterator方法
	public Object next() {
		if (hasNext())
			return equipment.get(i++);
		else
			throw new NoSuchElementException();
	}

}

        上面CompositeEquipment继承了Equipment,同时为自己里面的对象们提供了外部访问的方法,重载了Iterator,Iterator是Java的Collection的一个接口,是Iterator模式的实现.

        Step 5:
        我们在继续创建CompositeEquipment的两个具体类:盘盒Chassis和箱子Cabinet,箱子里面可以放很多东西,如底板,电源盒,硬盘盒等;盘盒里面可以放一些小设备,如硬盘 软驱等。无疑这两个都是属于组合体性质的。

public class Cabinet extends CompositeEquipment {

	public static double cabinetNetPrice = 10.0;
	public static double cabinetDiscountPrice = 5.0;

	public Cabinet(String name) {
		super(name);
	}

	// 柜子本身价格以及放在柜子里面盒子的价格.
	public double netPrice() {
		return cabinetNetPrice + super.netPrice();
	}

	public double discountPrice() {
		return cabinetDiscountPrice + super.discountPrice();
	}
}


public class Chassis extends CompositeEquipment {

	public static double chassisNetPrice = 2.0;
	public static double chassisDiscountPrice = 1.0;

	public Chassis(String name) {
		super(name);
	}

	// 盒子的价格以及盒子里面硬盘价格.
	public double netPrice() {
		return chassisNetPrice + super.netPrice();
	}

	//
	public double discountPrice() {
		return chassisDiscountPrice + super.discountPrice();
	}
}


        至此我们完成了整个Composite模式的架构。

        Step 6:
        现在我们来看一下组合模式的使用场景:
       
public class Client {

	public static void main(String[] args) {

		Cabinet cabinet = new Cabinet("柜子");

		Chassis chassis = new Chassis("盘盒");

		// 将盘盒装到箱子里
		cabinet.add(chassis);

		// 将硬盘装到盘盒里
		chassis.add(new Disk("硬盘"));

		// 查询整个柜子的实体价格
		System.out.println("整个柜子的实体价格(包括里面的盘盒和硬盘) =" + cabinet.netPrice());

		// 查询整个柜子的折扣价格
		System.out.println("整个柜子的折扣价格(包括里面的盘盒和硬盘) =" + cabinet.discountPrice());
	}
}

        上面调用的方法netPrice()或discountPrice(),实际上Composite使用Iterator遍历了整个树形结构,寻找同样包含这个方法的对象并实现调用执行.

        Composite是个很巧妙体现智慧的模式,在实际应用中,如果碰到树形结构,我们就可以尝试是否可以使用这个模式。
分享到:
评论

相关推荐

    JAVA设计模式chm文档

    设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制) 设计模式之Observer 设计模式之Chain of ...

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

    主要为大家详细介绍了java设计模式之组合模式Composite,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    JAVA设计模式之结构模式

    这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...

    33种JAVA设计模式DEMO

    组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任...

    Java设计模式之组合模式(Composite模式)介绍

    主要介绍了Java设计模式之组合模式(Composite模式)介绍,Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性,需要的朋友可以参考下

    设计模式_组合模式.zip

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...

    Java 设计模式

    java的设计模式大体上分为三大类: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元...

    java设计模式教程+源代码

    Composite ( 组合模式 ) Decorator ( 装饰模式 ) Facade ( 外观模式 ) Flyweight ( 享元模式 ) Proxy ( 代理模式 ) Chain of Responsibility ( 责任链模式 ) Command ( 命令模式 ) Interpreter ( 解释器模式 ...

    java设计模式之组合模式.docx

    把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式处理部分对象和整体对象。就像是图书管理员对图书馆的书籍进行整理,既可以对每一部分...容器(Composite)构建角色:有容器的特征,可以包含子节点。

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    JAVA设计模式-day2.pdf

    JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    11.组合模式(Composite) 8 12.享元模式(Flyweight) 9 13.模板模式 9 13、策略模式(strategy) 12 14、模板方法模式(Template Method) 13 15、观察者模式(Observer) 14 16、迭代子模式(Iterator) 16 17、...

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

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

    23种java设计模式

    2、结构模式:Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)。3、行为模式:Iterator(迭代模式)、Template(模板...

    Java设计模式,并加上个人理解

    11. 组合模式 (Composite Pattern) 12. 装饰者模式 (Decorator Pattern) 13. 访问者模式 (Visitor Pattern) 14. 迭代器模式 (Iterator Pattern) 15. 享元模式 (Flyweight Pattern) 16. 桥接模式 (Bridge ...

    23种java版设计模式源码案例.zip

    23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) 抽象工厂(abstract) 单例模式(singleton) 建造者模式(builder) 原型模式(prototype) 结构型模式...

    Java设计模式(含代码)

    Java设计模式 (含有相关源码) Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 Adapter:将一个类的接口转换成客户希望的另一个接口,使得原来由于接口不兼容而不能...

    JAVA经典设计模式大全

    2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5...

    java设计模式源码-DesignPattern:设计模式(Java实现源码)

    java ...组合模式(compositePattern) 装饰器模式(decoratorPattern) 外观模式(facadePattern) 享元模式(flyweightPattern) 代理模式(proxyPattern) 责任链模式(chainPattern) 命令模式(commandPatter

    JAVA设计模式.rar

    策略模式【STRATEGY PATTERN】 代理模式【PROXY PATTERN】 单例模式【SINGLETON PATTERN】  多例模式【MULTITION PATTERN】  工厂方法模式【FACTORY METHOD ...组合模式【COMPOSITE PATTERN】 ......

Global site tag (gtag.js) - Google Analytics