`

装饰者模式

阅读更多

使用对象组合的方式(被装饰者组合到装饰者里面),做到在运行时装饰类。

 

去数码城配电脑,除了买电脑,还需要配置很多配件。

Computer是一个抽象类,cost()方法是抽象的(因为每个电脑的价格都不一样),子类必须定义自己的实现。

个人电脑:Thinkpad,Acer, Sony等

电脑配件,如:MemoryBank,CD,Audio。根据所加的配件不同,最后买单的价格也不同。

 

第一种实现方式,我们为每种个人电脑和每种配件排列组合,生成笛卡尔积个数的类,调用对应的类的cost()方法,就可以直接得到最后买单的价格。

这种方式的缺点就是类太多,每次新增一个配件,就需要创建很多类。

 

下面用装饰者模式来实现:装饰者和被装饰者类型必须一致。(配件和个人电脑必须拥有相同的超类)

计算机为主体,然后在运行时,用配件来“装饰”个人电脑,比如个人电脑想增配一条内存条。

 

1、用户选了台thinkpad

Thinkpad继承自Computer,并且有一个计算价格的cost()方法。

 

2、用户增配了根内存

MemoryBank是个装饰者,它的类型“反映”了它所装饰的对象。所谓反映,就是两者类型一致。

所以MemoryBank也有一个计算价格的cost()方法。

通过多态,也可以把MemoryBank所包裹的任何Computer当成是Computer。

 

3、还想配个音响

Audio是个装饰者,并用它将MemoryBank对象包装起来。

 

4、买单的时候,通过调用最外面的装饰者(Audio)的cost()方法就可以了。

Audio会先委托它装饰的对象(MemoryBank)计算出价格,然后再加在音响的价格。

 

可以用一个或多个装饰者包装一个对象。

因为装饰者和被装饰者有相同的超类,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它。

装饰者可以在所委托的被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。

运行时动态地、不限量的用你喜欢的装饰者来装饰对象。

 

装饰者模式:动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

 

每个装饰者都有一个组件,也就是说,装饰者有一个实例变量以保存某个被装饰者的引用。

package com.ez.component;

import com.ez.Computer;
import com.ez.decorator.Audio;
import com.ez.decorator.MemoryBank;
/**
 * 装饰者模式,通过装饰者,动态算出清单价格。
 * @author 窗外赏雪(EZ编程网)
 */
public class DecoratorTest {
	public static void main(String[] args) {
		Computer thinkpad=new Thinkpad();
		System.out.println(thinkpad.getDescription()+" ¥"+thinkpad.cost());
		
		Computer acer=new Acer();
		acer=new Audio(acer);
		acer=new MemoryBank(acer);
		System.out.println(acer.getDescription()+" ¥"+acer.cost());
	}
}

 

 

package com.ez;
/**
 * 电脑
 * @author 窗外赏雪
 */
public abstract class Computer {
	public String description="电脑";

	public String getDescription() {
		return description;
	}
	
	public abstract double cost();
}

 

package com.ez.component;

import com.ez.Computer;
/**
 * 宏基电脑
 * @author 窗外赏雪(EZ编程网)
 */
public class Acer extends Computer{

	public Acer() {
		description="宏基电脑";
	}
	
	@Override
	public double cost() {
		return 2500;
	}
}

 

package com.ez.component;

import com.ez.Computer;
/**
 * thinkpad电脑
 * @author 窗外赏雪(EZ编程网)
 */
public class Thinkpad extends Computer{
	public Thinkpad() {
		description="thinkpad";
	}
	@Override
	public double cost() {
		return 3500;
	}
	
}

 

package com.ez;
/**
 * 电脑配件装饰者
 * @author 窗外赏雪(EZ编程网)
 *
 */
public abstract class ComputerPartsDecorator extends Computer{
	/**
	 * 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
	 * 需要重新实现方法,不能直接继承,因为要加自己的行为。
	 */
	public abstract String getDescription();
}

 

package com.ez.decorator;

import com.ez.Computer;
import com.ez.ComputerPartsDecorator;
/**
 * 音响:继承电脑配件装饰者,价格为100。
 * 通过构造方法来装饰电脑,通过组合被装饰者,实现装饰者模式。
 * 装饰者和被装饰者类型必须一致。
 * @author 窗外赏雪(EZ编程网)
 */
public class Audio extends ComputerPartsDecorator{

	Computer computer;
	
	public Audio(Computer computer) {
		this.computer=computer;
	}
	
	/**
	 * 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
	 */
	@Override
	public String getDescription() {
		return computer.getDescription()+" +Audio";
	}

	/**
	 * 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
	 */
	@Override
	public double cost() {
		return 100+computer.cost();
	}

}

 

package com.ez.decorator;

import com.ez.Computer;
import com.ez.ComputerPartsDecorator;
/**
 * 内存条:继承电脑配件装饰者,价格为200。
 * 通过构造方法来装饰电脑,通过组合被装饰者,实现装饰者模式。
 * 装饰者和被装饰者类型必须一致。
 * @author 窗外赏雪(EZ编程网)
 */
public class MemoryBank extends ComputerPartsDecorator{

	Computer computer;
	public MemoryBank(Computer computer) {
		this.computer=computer;
	}
	@Override
	public String getDescription() {
		return computer.getDescription()+" +MemoryBank";
	}

	@Override
	public double cost() {
		return 200+computer.cost();
	}

}

 

 

 

分享到:
评论
1 楼 sanpic 2015-03-05  
通俗易懂,不错

相关推荐

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    装饰者模式Demo

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展其功能,为对象增加新的行为或属性,同时保持了代码的可读性和可...

    装饰者模式Android实例

    装饰者模式是设计模式的一种,属于结构型模式,它的主要目的是动态地给对象添加新的行为或职责,而无需改变对象的原始代码。在Android开发中,装饰者模式的应用相当广泛,尤其是在视图组件的扩展和功能增强上。下面...

    设计模式 - 装饰者模式.rar

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象本身。这种模式的核心思想是通过将对象包装在一个装饰类中来扩展功能,而不是通过继承。以下是对装饰者模式的详细阐述: ...

    java装饰者模式实现

    装饰者模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时动态地给对象添加新的职责,而不必修改原有代码,遵循“开闭原则”。在Java中,装饰者模式通常通过继承和组合来实现,尤其适用于那些...

    c# ,设计模式,装饰者模式,星巴兹咖啡

    装饰者模式是面向对象设计模式中的一个重要概念,它在C#等编程语言中广泛应用。这个例子以星巴克咖啡为例,展示了如何使用装饰者模式来灵活地扩展对象的功能,而无需修改原有代码。 装饰者模式的核心思想是动态地将...

    设计模式的装饰者模式的例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有的代码。这种模式遵循开闭原则,即对扩展开放,对修改关闭,使得我们可以在不改变对象原有结构的情况下,通过...

    Qt设计模式之装饰者模式

    **Qt设计模式之装饰者模式** 装饰者模式(Decorator Pattern)是软件设计模式中的结构型模式之一,它允许在运行时动态地给一个对象添加新的行为或职责,而无需修改对象本身。在Qt库中,装饰者模式也被广泛应用,...

    装饰者模式 C++ 实现

    装饰者模式是一种设计模式,它允许我们向一个对象动态地添加新的行为或责任,而无需修改对象本身的代码。在C++中实现装饰者模式,我们可以遵循以下步骤和关键概念: 1. **定义接口**:首先,我们需要定义一个基础...

    装饰者模式demo

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有的代码。这种模式遵循开闭原则,即对扩展开放,对修改关闭,使得我们的系统更加灵活,易于维护和扩展。 装饰...

    装饰者模式案例学习代码

    装饰者模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为和职责。这种模式在软件工程中广泛应用,因为它提供了一种灵活的方式来扩展对象的功能,而不会破坏其原有的结构。在Java、...

    装饰者模式的典型应用。

    装饰者模式是设计模式中的一种结构型模式,它在不改变对象原有行为的基础上,动态地为对象添加新的功能。这种模式常被用于扩展或增强对象的功能,而无需修改原对象的代码,符合“开闭原则”。在Java的SSL(Secure ...

    Headfirst(三)装饰者模式C++实现

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这种模式在C++中的应用尤为广泛,因为它提供了灵活性,能够扩展对象的功能,同时保持代码的可读性和可维护性。 ...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

    装饰者模式代码demo

    装饰者模式是一种结构型设计模式,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这种模式通过将对象包装在一个装饰类中来实现,装饰类与原类有相同的接口,因此可以透明地替换或增强原有对象的...

    游戏设计3-装饰者模式-装备

    装饰者模式是面向对象设计中的一种行为设计模式,它允许在运行时动态地给对象添加新的职责或行为,而无需改变对象本身。在游戏设计中,装饰者模式常常被用来扩展角色、装备等对象的功能,使得游戏内容更加丰富且易于...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...

    设计模式之装饰者模式,内含可运行代码

    装饰者模式是面向对象设计中的一种经典模式,它在不修改已有对象的源代码或继承体系的情况下,通过组合的方式动态地给对象添加新的行为或职责。这种模式在实际开发中非常常见,尤其在需要灵活扩展功能,而又不想破坏...

Global site tag (gtag.js) - Google Analytics