设计模式: 自己手动写一个装饰者模式

装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供l比继承更有弹性的替代方案。装饰者和被装饰者有相同的超类型,你可以用一个或多个装饰者包装一个对象。既然装饰者和被装饰者有相同的超类型,所以在任何需要原始对象(被装饰者)的场合,可以用装饰过的对象替换它。装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,已达到特定的目的。对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象。

类图:

源代码如下:

package decorator;
/**
 * 饮料的超类
 * @author <span style="font-family: Arial, Helvetica, sans-serif;">Arvon</span>

 *
 */
public abstract class Beverage {
	String description = "Unknown Beverage";
	public String getDescription() {
		return description;
	}
	public abstract float cost();
}
package decorator;
/**
 * 一种饮料 被装饰者
 * @author <span style="font-family: Arial, Helvetica, sans-serif;">Arvon</span><pre name="code" class="java">

* */public class HouseBlend extends Beverage {public HouseBlend() {super();description = "House Blend Coffee";}@Overridepublic float cost() {// TODO Auto-generated method stubreturn 0.89f;}}


package decorator;
/**
 * 佐料装饰类 佐料超类
 * @author Administrator
 *
 */
public abstract class CondimentDecorator extends Beverage {
	public Beverage mBeverage;
	@Override
	public abstract String getDescription();

	@Override
	public abstract float cost();

}
package decorator;
/**
 * 一种佐料 装饰者
 * @author Administrator
 *
 */
public class Milk extends CondimentDecorator {

	public Milk(Beverage mBeverage) {
		this.mBeverage = mBeverage;
	}

	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return "Milk " + mBeverage.getDescription();
	}

	@Override
	public float cost() {
		return .20f + mBeverage.cost();
	}

}
package decorator;
/**
 * 一种佐料 装饰者
 * @author Administrator
 *
 */
public class Mocha extends CondimentDecorator {

	public Mocha(Beverage mBeverage) {
		super();
		this.mBeverage = mBeverage;
	}

	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return "Mocha "+mBeverage.getDescription();
	}

	@Override
	public float cost() {
		// TODO Auto-generated method stub
		return 1.2f + mBeverage.cost();
	}

}
package decorator;
/**
 * for testing
 * @author Administrator
 *
 */
public class StarbuzzCoffee {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Beverage mBeverage = new HouseBlend();
		System.out.println(mBeverage.getDescription()
				+ " $" + mBeverage.cost());

		mBeverage = new Milk(mBeverage);
		System.out.println(mBeverage.getDescription()
				+ " $" + mBeverage.cost());
		mBeverage = new Mocha(mBeverage);
		System.out.println(mBeverage.getDescription()
				+ " $" + mBeverage.cost());
	}

}

程序的输出:

House Blend Coffee $0.89

Milk House Blend Coffee $1.09

Mocha Milk House Blend Coffee $2.29

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 16:38:55

设计模式: 自己手动写一个装饰者模式的相关文章

设计模式(十):装饰者模式

在<JavaScript设计模式>介绍中,装饰者模式跟Mixin(混入)模式相比,是另一种可行的对象子类化(Mixin模式干的事)的替代方案. 装饰者(Decorator)模式 定义: 给对象动态添加额外的功能.向基本对象添加(装饰)属性或方法,而不是进行子类化,它较为精简. 使用场景: java IO 流是典型的装饰模式. PS:应用程序包含需要大量不同类型对象的功能. 例子: // The constructor to decorate function MacBook() { this.

《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式

装饰者模式是JDK中另一个使用较多的设计模式,上一个是观察者模式(在Swing中大量使用),业内好的API设计无一离不开常见的设计模式,通常我们所说要阅读源码,也是为了学习大牛们的设计思路.----题记 设计模式 观察者模式:定义了对象之间一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新. 装饰者模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供比继承者更有弹性的替代方案. 设计原则 (1)封装变化. (2)多用组合,少用继承. (3)针对接口编程,而不是

原来热加载如此简单,手动写一个 Java 热加载吧

1. 什么是热加载 热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环境. 2. 热加载与热部署的区别 首先,不管是热加载还是热部署,都可以在不重启服务的情况下编译/部署项目,都是基于 Java 的类加载器实现的. 那么两者到底有什么区别呢? 在部署方式上: 热部署是在服务器运行时重新部署项目. 热加载是在运行时重新加载 class. 在实现原理上: 热部署是直接重新

每天一个设计模式(3):装饰者模式

3.装饰者模式 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 一.问题引入 咖啡店的类设计: 一个饮料基类,各种饮料类继承这个基类,并且计算各自的价钱. 饮料中需要加入各种调料,考虑在基类中加入一些布尔值变量代表是否加入各种调料,基类的cost()中的计算各种调料的价钱,子类覆盖cost(),并且在其中调用超类的cost(),加上特定饮料的价钱,计算出子类特定饮料的价钱. 缺点:类数量爆炸.基类加入的新功能并不适用于所有的子类.调料价钱的改变.新调料的

设计模式解密(9)- 装饰者模式

1.简介 定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 拆分定义,总结特点:   1.不改变原类文件. 2.不使用继承. 3.动态扩展. 主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀. 何时使用:在不想增加很多子类的情况下扩展类. 如何解决:将具体功能职责划分,同时继承装饰者模式. 英文:Decrator 类型:结构型模式 2.类图

菜鸟版JAVA设计模式—从火锅底料到装饰器模式

今天开始学历了JAVA设计模式中的装饰模式,照例还是写下自己理解的心得吧. 装饰器模式,啥是装饰器模式?带着这个问题,咱们好好的去火锅店吃个火锅. "老板,来份全辣锅底,不要给我用装饰器模式来配料!"我特地狠狠的强调了最后一句话. 不到一会,老板给我端来了一个火锅和几个盘子,火锅里装了盐水,而盘子里放了辣椒,花椒,茴香,大蒜等佐料.......... 这时候大家可能就需要问了,这咋吃啊...难道让我自己配料么? 这便是是我们的矛盾了!客户需要的一盘已经配好料的火锅汤底,但是我们初期给用

设计模式(三):装饰器模式

一.概述 装饰器模式动态地将责任附加到对象上.想要扩展功能,装饰者提供了有别于继承的另一种选择.简单描述就是包装对象,让对象提供新的行为. 二.解决问题 当一个类想要获得一个行为,我们会想到面向对象四大特性之一的继承,继承能够让子类从父类中获得行为,实现很好的代码复用.但这种继承而来的行为是在编译时静态决定的,而且所有的子类都会继承相同的行为.如果我们想要扩展对象的行为,就要创建一个子类来修改父类的方法(也就是覆盖父类行为),每扩展一个行为就要创建一个子类,这样会带来很多问题.第一,如果需要扩展

设计模式(五): 装饰者模式

装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 我们通过下面的实例来演示装饰器模式的用法.其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类. 介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活. 主要解决:一般的,我们

设计模式: 自己手动写一个代理模式

代理模式:为另一个对象提供一个替身或占位符以访问这个对象.代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种. 远程代理管理客户和远程对象之间的交互. 虚拟代理控制访问实例化开销大的对象. 保护代理基于调用者控制对对象方法的访问. 代理模式有许多变体,例如:缓存代理.同步代理.防火墙代理.写入时复制代理. Java内置的代理支持,可以根据需要动态创建代理,并将所有调用分配到所选的调用处理器(InvocationHandler). 下面 的例子是一种保护代理 类图: 源