head first-----decorate design pattern
动态的将责任附加到对象上,若是要扩展功能,装饰者提供了比继承更加具有弹性的替代方案。
其中,装饰者模式秉承着一个原则:对外扩展开放,对修改关闭。、
下面以一个例子为实例来加强对此模式的理解
以下是星巴克咖啡生产咖啡为例,定义一个Beverage abstract class 用于表示饮料的总称,里面包括两个方法getDescription()、cost()。定义一个装饰组件CondimentDecorate CoComponent,其主要是用来调料装饰的。其继承Beverage抽象类。定义四中咖啡类型:DarkRoast、Decaf、Espresso、HouseBlend。四个装饰调料对象:Milk、Mocha、Soy、Whip。其中调料组件和具体的调料组件具有相同的超类属性。我们可以在类动态的运行的时候再根据客户的需求加入相应的调料,从而可以生产各种各样的咖啡饮料。
以下是具体代码实现:
package com.clark.decoratepattern.abstractclass;
/**
* 定义一个饮料抽象类
* @author Administrator
*
*/
public abstract class Beverage {
public String description="Unknown Beverage";
public String getDescription(){
return description;
}
public abstract double cost();
}
package com.clark.decoratepattern.abstractclass;
/**
* 调料抽象类,用于装饰饮料
* 其应该和被装饰的类具有相同的超类
* @author Administrator
* 所有的装饰者类也即调料者都必须重新实现getDescription()方法
*/
public abstract class CondimentDecorate extends Beverage {
public abstract String getDescription();
}
package com.clark.decoratepattern;
import com.clark.decoratepattern.abstractclass.Beverage;
/**
* 综合咖啡类
* @author Administrator
*
*/
public class HouseBlend extends Beverage {
public double cost() {
return 0.89;
}
public HouseBlend(){
description="House Blend Coffee";
}
}
package com.clark.decoratepattern;
import com.clark.decoratepattern.abstractclass.Beverage;
/**
* 浓缩咖啡类
* @author Administrator
*
*/
public class Espresso extends Beverage {
//属性继承自父类
public Espresso(){
description="Espresso";
}
public double cost() {
return 1.99;
}
}
package com.clark.decoratepattern;
import com.clark.decoratepattern.abstractclass.Beverage;
/**
* 低咖啡因
* @author Administrator
*
*/
public class Decaf extends Beverage {
public double cost() {
return 1.05;
}
public Decaf(){
description="decaf";
}
}
package com.clark.decoratepattern;
import com.clark.decoratepattern.abstractclass.Beverage;
/**
* 深度烘焙咖啡
* @author Administrator
*
*/
public class DarkRoast extends Beverage{
@Override
public double cost() {
return 0.99;
}
public DarkRoast(){
description="dark roast coffee";
}
}
package com.clark.decoratepattern.decorate;
import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.abstractclass.CondimentDecorate;
/**
* 奶泡Whip调料装饰对象
* @author Administrator
*
*/
public class Milk extends CondimentDecorate {
Beverage beverage;
public Milk(Beverage beverage){
this.beverage=beverage;
}
@Override
public String getDescription() {
return this.beverage.getDescription()+",Milk";
}
@Override
public double cost() {
return this.beverage.cost()+0.10;
}
}
package com.clark.decoratepattern.decorate;
import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.abstractclass.CondimentDecorate;
/**
* 摩卡装饰调料类
* @author Administrator
*
*/
public class Mocha extends CondimentDecorate {
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage=beverage;
}
//返回装饰调料的同时把其它的调料也描述
public String getDescription() {
return this.beverage.getDescription()+",Mocha";
}
//返回增加Mocha后的调料总价格
public double cost() {
return 0.20+this.beverage.cost();
}
}
package com.clark.decoratepattern.decorate;
import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.abstractclass.CondimentDecorate;
/**
* 豆浆Soy调料的装饰
* @author Administrator
*
*/
public class Soy extends CondimentDecorate {
Beverage beverage;
public Soy(Beverage beverage) {
this.beverage=beverage;
}
@Override
public String getDescription() {
return this.beverage.getDescription()+",Soy";
}
@Override
public double cost() {
return this.beverage.cost()+0.15;
}
}
package com.clark.decoratepattern.decorate;
import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.abstractclass.CondimentDecorate;
/**
* 奶泡Whip调料装饰对象
* @author Administrator
*
*/
public class Whip extends CondimentDecorate {
Beverage beverage;
public Whip(Beverage beverage){
this.beverage=beverage;
}
@Override
public String getDescription() {
return this.beverage.getDescription()+",Whip";
}
@Override
public double cost() {
return this.beverage.cost()+0.10;
}
}
以下是测试类:即可以根据客户的需求来生产咖啡
package com.clark.decoratepattern;
import com.clark.decoratepattern.abstractclass.Beverage;
import com.clark.decoratepattern.decorate.Milk;
import com.clark.decoratepattern.decorate.Mocha;
import com.clark.decoratepattern.decorate.Soy;
import com.clark.decoratepattern.decorate.Whip;
/**
* Test class
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
//来一杯浓缩咖啡,之家牛奶Milk
Beverage bev=new Espresso();
bev=new Milk(bev);
System.out.println(bev.getDescription()+" $"+bev.cost());
//来一杯深陪咖啡,加牛奶和摩卡
Beverage bev2=new DarkRoast();
bev2=new Milk(bev2);
bev2=new Mocha(bev2);
System.out.println(bev2.getDescription()+" $"+bev2.cost());
//来一杯低咖啡因,内加牛奶、摩卡、奶泡
Beverage bev3=new HouseBlend();
bev3=new Milk(bev3);
bev3=new Mocha(bev3);
bev3=new Whip(bev3);
System.out.println(bev3.getDescription()+" $"+bev3.cost());
//来一杯综合的咖啡,内部加奶牛、摩卡、奶泡、豆浆
Beverage bev4=new Decaf();
bev4=new Milk(bev4);
bev4=new Mocha(bev4);
bev4=new Whip(bev4);
bev4=new Soy(bev4);
System.out.println(bev4.getDescription()+" $"+bev4.cost());
}
}
head first-----decorate design pattern的更多相关文章
- python singleton design pattern super() 多继承
python singleton design pattern decorate baseclass metaclass import module super() 一.A decorator de ...
- 说说设计模式~大话目录(Design Pattern)
回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...
- 设计模式(Design Pattern)系列之.NET专题
最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...
- [转]Design Pattern Interview Questions - Part 4
Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...
- [转]Design Pattern Interview Questions - Part 2
Interpeter , Iterator , Mediator , Memento and Observer design patterns. (I) what is Interpreter pat ...
- [转]Design Pattern Interview Questions - Part 3
State, Stratergy, Visitor Adapter and fly weight design pattern from interview perspective. (I) Can ...
- [转]Design Pattern Interview Questions - Part 1
Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...
- design pattern
1. visitor design pattern http://butunclebob.com/ArticleS.UncleBob.IuseVisitor
- Design Pattern: Observer Pattern
1. Brief 一直对Observer Pattern和Pub/Sub Pattern有所混淆,下面打算通过这两篇Blog来梳理这两种模式.若有纰漏请大家指正. 2. Use Case 首先我们来面 ...
- Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern
Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...
随机推荐
- [jQuery] Cannot read property ‘msie’ of undefined错误的解决方法
最近把一个项目的jQuery升级到最新版,发现有些页面报错Cannot read property ‘msie’ of undefined.上jQuery网站上搜了一下,原因是$.browser这个a ...
- 零售ERP开发(一)
随着企业信息化不断提高,各种企业管理系统应用而生:怎么才能开发一套简洁.易用.功能健全的管理系统,尤其是能够帮助企业做出重大策略的系统,一致是我们追求的目标.近些年,接触的Erp系统主要包括国内比较知 ...
- php根据经纬度计算距离和方向--摘录自http://haotushu.sinaapp.com/post-520.html
define('EARTH_RADIUS', 6367000);//需定义的静态变量 function getRadian($d) { return $d * M_PI / 180; } functi ...
- js更新页面,随机更新数字
代码1: <script> function getRandom(){ var i = Math.random()*40+160; document.getElementById(&quo ...
- ASP.Net Web 点击链接直接下载 不在浏览器打开
目标是:用户点击链接直接弹出下载框,不在浏览器打开文件. 一般网站下载的功能,本以为直接把虚拟路径赋值给链接就行了,没想到测试的时候发现图片,文本和PDF格式的文件都自动在Firefox里面打开了,没 ...
- windows通过Composer安装yii2
1. php.ini 中;extension=php_openssl.dll(取消注释,不然在安装composer过程中会报错) 集成环境最好去php目录中打开php.ini文件,确定;extensi ...
- uboot环境变量初始化
一.环境变量概述 1.环境变量的概念 可以理解为用户对软件的全局配置信息,这部分信息应该可以从永久性存储器上读取,能被查询,能被修改. 启动过程中,应该首先把环境变量读取到合适的内存区域,然后利用环境 ...
- 学习总结之Log4NET
通过在网上查找了一些资料,用了些时间学习了log4NET,做了一个小小的总结,说一下它的特点吧 首先呢log4NET是.Net下一个非常优秀的开源日志记录组件.它可以将日志分成不同等级,也可以按照我们 ...
- Learning LexRank——Graph-based Centrality as Salience in Text Summarization(一)
(1)What is Sentence Centrality and Centroid-based Summarization ? Extractive summarization works by ...
- python 模块导入
1. 模块导入: 要使用一个模块,我们必须首先导入该模块.Python使用import语句导入一个模块.例如,导入系统自带的模块 math: import math 你可以认为math就是一个指向已导 ...