关闭

Java中的装饰者模式

712人阅读 评论(0) 收藏 举报
分类:

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

接下来举一个例子来说明,这个例子是Head Frist 设计模式中的一个例子

场景:在星巴克的咖啡销售系统中,提供咖啡和调料的组合,并且在用户选好了咖啡和调料之后自动计算价格

某客户点了 浓缩咖啡加摩卡加牛奶的组合

首先是饮料类的抽象类

package com.zw.mymaven;

//饮料的抽象类
public abstract class Beverage {
	String description = "Unknown Beverage";
	//描述 
	public String getdescribtion() {
		return description;
	}
	//花 费
	public abstract double cost();
}
调料类的抽象类

package com.zw.mymaven;

//调料类,也是装饰者类
public abstract class CondimentDecorrator {
	//这里要重写getDescribtion的原因
	//所谓装饰者类 其实就是包含被装饰者的类
	//那么被装饰者和装饰者中的共有的还没定义的方法在这里定义
	public abstract String getDescribtion();
}

浓缩咖啡类

package com.zw.mymaven;

//浓缩咖啡的饮料类的实现
public class Espresso extends Beverage {
	public Espresso() {
		description = "这是一杯浓缩咖啡";
	}
	@Override
	public double cost() {
		return 1;
	}
}
摩卡类

package com.zw.mymaven;

public class Moka extends CondimentDecorrator {
	Beverage beverage;

	public Moka(Beverage beverage) {
		this.beverage = beverage;
	}

	@Override
	public String getDescribtion() {
		return beverage.getdescribtion() + "加了摩卡,";
	}

	public double cost() {
		return beverage.cost() + 2;
	}
}

牛奶类

package com.zw.mymaven;

public class Milk extends CondimentDecorrator {
	Beverage beverage;
	public Milk(Beverage beverage) {
		this.beverage = beverage;
	}
	@Override
	public String getDescribtion() {
		return beverage.getdescribtion() + "加了牛奶,";
	}
	public double cost() {
		return beverage.cost() + 3;
	}
}
测试类

package com.zw.mymaven;

public class Test3 {

	public static void main(String[] args) {
		// 点一杯浓缩咖啡
		Beverage espresso = new Espresso();
		// 加入摩卡
		espresso = new Moka(espresso);
		// 加入牛奶
		espresso = new Milk(espresso);
		System.out.println(espresso.getdescribtion() + "花费了" + espresso.cost());
	}

}


0
0
查看评论

JAVA设计模式初探之装饰者模式

这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复...
  • jason0539
  • jason0539
  • 2014-04-01 09:07
  • 76500

Java 设计模式 装饰者模式

装饰者模式 在设计的时候,往往要给一个对象的功能进行一些修饰,对功能进行拓展和增强,以满足我们的需求。    举个例子,最近流行歌曲比赛,什么《中国好声音》,《中国好歌曲》什么的,对于一个参赛者而言,就是唱歌,定义类如下: public class Competitor...
  • u010349169
  • u010349169
  • 2014-02-09 23:57
  • 5842

学习、探究Java设计模式——装饰者模式

定义装饰者模式:在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。设计原则要使用装饰者模式,需要满足以下设计原则: 1、多用组合,少用继承 2、开放-关闭原则:类应该对拓展开放,对修改关闭UML...
  • a553181867
  • a553181867
  • 2016-08-03 22:52
  • 4406

装饰者模式 java代码小示例

<br /><br />1、定义及作用<br />该模式以对客户端透明的方式扩展对象的功能。<br />2、涉及角色<br />抽象构件角色:定义一个抽象接口,来规范准备附加功能的类。<br />具体构件角色:将要被附加功能的类...
  • xiaoquanhuang
  • xiaoquanhuang
  • 2011-04-08 20:07
  • 2839

JAVA设计模式——装饰者模式

装饰者模式 动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 具体被装饰者和抽象装饰类都继承于抽象被装饰者类,继承的是类型,而不是行为。行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。 装饰者通常是用其他类似于工厂或生成器这样的模式创建的。  ...
  • cai1213
  • cai1213
  • 2012-09-21 11:51
  • 12245

JDK中的装饰模式:Java I/O

Java I/O使用装饰模式设计,JDK中还有很多类是使用装饰模式设计的,如:Reader类、Writer类、OutputStream类等,如果使用这种结构,那么在基础方法上添加新的功能将十分简单
  • a19881029
  • a19881029
  • 2013-05-29 20:26
  • 2454

Java中的装饰者模式

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案 接下来举一个例子来说明,这个例子是Head Frist 设计模式中的一个例子 场景:在星巴克的咖啡销售系统中,提供咖啡和调料的组合,并且在用户选好了咖啡和调料之后自动计算价格 某客户点了 浓缩咖啡加摩卡加牛...
  • qq_28007533
  • qq_28007533
  • 2016-12-08 00:14
  • 712

java装饰者模式

装饰者模式:给一个对象增加一些新的功能,而且要求是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。 假如我们想对房子进行装饰,首先得有一个House接口,里面有装饰的方法,代表是装饰房子这样的一个通用的特性。 House接口: public interface Hous...
  • uk8692
  • uk8692
  • 2015-05-09 23:37
  • 590

装饰者模式源代码java

  • 2014-01-18 21:59
  • 3KB
  • 下载

java装饰者模式实现

  • 2014-09-05 22:57
  • 8KB
  • 下载
    个人资料
    • 访问:30150次
    • 积分:1162
    • 等级:
    • 排名:千里之外
    • 原创:87篇
    • 转载:17篇
    • 译文:0篇
    • 评论:1条
    最新评论