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

原创 2015年07月10日 14:48:36

---------------------------------根据《Head First 设计模式》整理记忆----------------------------------

解决问题:从一个星巴兹咖啡店开始,有饮料和调料构成,饮料可以添加多种调料,调料有蒸奶,摩卡,豆浆等。

设计原则:类应该对扩展开放,对修改关闭。



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

 要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

装饰者包含一个超类的对象,这样,可以在被装饰者行为前或者行为后加上新的行为,甚至取代原有的行为

装饰者会使程序中出现很多小类,增加使用难度

1.超类:

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 创建时间:2015年7月10日 下午3:12:15 类说明
 */
public abstract class Beverage {
	String description = "Unknow Beverage";

	public String getDescription() {
		return description;
	}

	public abstract double cost();
}

2.装饰者总类:

package DecoratorPattern;
/** 
 * @author 作者 E-mail: 
 * @version 创建时间:2015年7月10日 下午3:14:43 
 * 类说明 
 */
public abstract class CondimentDecorator extends Beverage {
	public abstract String getDescription();
}

3.四种被装饰者类:

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 创建时间:2015年7月10日 下午3:16:07 类说明
 */
public class DarkRoast extends Beverage {
	public DarkRoast() {
		description = "DarkRoast";
	}

	public double cost() {
		return 3.99;
	};
}

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 创建时间:2015年7月10日 下午3:16:07 类说明
 */
public class Decat extends Beverage {
	public Decat() {
		description = "Decat";
	}

	public double cost() {
		return 4.99;
	};
}

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 创建时间:2015年7月10日 下午3:16:07 类说明
 */
public class Espresso extends Beverage {
	public Espresso() {
		description = "Espresso";
	}

	public double cost() {
		return 1.99;
	};
}

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 创建时间:2015年7月10日 下午3:16:07 类说明
 */
public class HouseBlend extends Beverage {
	public HouseBlend() {
		description = "HouseBlend";
	}

	public double cost() {
		return 2.99;
	};
}

4.三种装饰者类:

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 创建时间:2015年7月10日 下午3:19:36 类说明
 */
public class Mocha extends CondimentDecorator {
	Beverage beverage;

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

	public String getDescription() {
		return beverage.getDescription() + ", Mocha";
	};

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

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 创建时间:2015年7月10日 下午3:19:36 类说明
 */
public class Soy extends CondimentDecorator {
	Beverage beverage;

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

	public String getDescription() {
		return beverage.getDescription() + ", Soy";
	};

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

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 创建时间:2015年7月10日 下午3:19:36 类说明
 */
public class Whip extends CondimentDecorator {
	Beverage beverage;

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

	public String getDescription() {
		return beverage.getDescription() + ", Whip";
	};

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

5.窗口测试类:

package DecoratorPattern;

/**
 * @author 作者 E-mail:
 * @version 创建时间:2015年7月10日 下午3:23:40 类说明
 */
public class TestMain {

	public static void main(String[] args) {
		Beverage beverage = new Espresso();
		System.out.println(beverage.getDescription() + " $" + beverage.cost());

		Beverage beverage1 = new DarkRoast();
		beverage1 = new Mocha(beverage1);
		beverage1 = new Mocha(beverage1);
		beverage1 = new Whip(beverage1);
		System.out
				.println(beverage1.getDescription() + " $" + beverage1.cost());

		Beverage beverage2 = new DarkRoast();
		beverage2 = new Soy(beverage2);
		beverage2 = new Mocha(beverage2);
		beverage2 = new Whip(beverage2);
		System.out
				.println(beverage2.getDescription() + " $" + beverage2.cost());
	}

}


---------附全部源代码:http://download.csdn.net/detail/bingbing8219/8887627------------------------------


设计模式 装饰者模式 带你重回传奇世界

今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义。 装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。 先简单描述下装饰者模式发挥作用的地方,当我...
  • lmj623565791
  • lmj623565791
  • 2014年04月21日 20:21
  • 17597

我所理解的设计模式(C++实现)——装饰者模式(Decorator Pattern)

解决的问题: 我们在装饰新家的时候买了几幅抽象画,买回来之后发现有些加上色彩艳丽的边框更适合我们,而有的加上玻璃罩之后更能符合我们的使用。那我们来怎么解决这个问题呢?他需要动态的给别的对象增加额...
  • tanningzhong
  • tanningzhong
  • 2015年01月24日 14:47
  • 570

Java:一夜一发设计模式(一)------装饰者模式

一,什么时候使用装饰者模式?比如有一家店卖饮品,饮品就有不少种,每一种还可以加项,比如给可乐加冰,加糖,兑水什么的,每次加项的价格还不同,就会将代码弄的很繁琐,这种情况下就可以使用装饰者模式来实现. ...
  • android_zyf
  • android_zyf
  • 2017年03月30日 01:53
  • 579

Java 设计模式 装饰者模式

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

Head First设计模式:(三)装饰者模式

星巴兹咖啡准备更新订单系统,以合乎他们的饮料供应需求。 他们原先的类设计为: 这样的订单系统没有办法考虑到咖啡调料的部分,把加入不同调料的咖啡看做不同的类会导致类爆炸(每个类的cost方法计算...
  • lissdy
  • lissdy
  • 2012年05月06日 19:31
  • 3038

设计模式-装饰者模式(Go语言描述)

什么是装饰者模式好久没有更新设计模式系列的博客了, 今天我们来聊一聊装饰者模式, 用过java的同学肯定对装饰者模式非常熟悉,就算你不知道什么是装饰者模式这概念, 你也一定在代码中经常用到这个模式,为...
  • qibin0506
  • qibin0506
  • 2016年04月07日 08:55
  • 5367

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

定义装饰者模式:在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。设计原则要使用装饰者模式,需要满...
  • a553181867
  • a553181867
  • 2016年08月03日 22:52
  • 4382

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

这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常...
  • jason0539
  • jason0539
  • 2014年04月01日 09:07
  • 76429

从装饰者模式到Context类族

本着不学习就要落后,落后就要挨打的态度,我也开始捣鼓起了设计模式。但只看设计模式又不免有些索然无味,索性就连Android源码也一起研究研究,现在看来效果不错。昨天晚上刚看了装饰者模式,正好今天总结一...
  • sdkfjksf
  • sdkfjksf
  • 2016年09月22日 16:40
  • 2037

设计模式学习之装饰模式:IO流的装饰器

IO流的装饰器 题目分析:通过对java的io系列类分析得知,java的io流使用了设计模式中的装饰模式,以动态的给一个对象增加职责,能够更加灵活的增加功能。通过看io的源代码得知FilterOut...
  • u014293306
  • u014293306
  • 2015年06月23日 14:07
  • 1413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式---装饰者模式
举报原因:
原因补充:

(最多只允许输入30个字)