写在前面的话:

  该模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。

  该模式的实现意味着一群装饰者类,这些类反映出被装饰的组件类型,用来包装具体组件。

缺点在于,可以用无数个装饰者包装一个组件,但会导致设计中出现许多小对象,如果过度引用,会让程序变得很复杂。

案例分析:

需求:模拟 StarbuzzCoffee 的订单系统,咖啡原种类为Espresso,HouseBlend,添加调料种类分别为Soy,Mocha,Whip,对应不同的收费,杯子分为大中小三种,分别对应不同的收费

代码实现:

1)咖啡部分:

public abstract class Beverage {
String description = "Unknown Beverage"; public String getDescription(){
return description;
} public abstract double cost();
}
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
} @Override
public double cost() {
return 1.99;
}
} public class HouseBlend extends Beverage {
public HouseBlend() {
description = "HouseBlend";
} @Override
public double cost() {
return 0.89;
}
}

2)调料部分:

public abstract class CondimentBeverage extends Beverage {
public abstract String getDescription();
} public class Soy extends CondimentBeverage {
Beverage beverage; public Soy(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription();
} @Override
public double cost() {
return 0.30+beverage.cost();
}
} public class Mocha extends CondimentBeverage {
Beverage beverage; public Mocha(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription();
} @Override
public double cost() {
return 0.20+beverage.cost();
}
} public class Whip extends CondimentBeverage {
Beverage beverage; public Whip(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription();
} @Override
public double cost() {
return 0.40+beverage.cost();
}
}

 3) 杯子选择:

public abstract class Size extends Beverage {
public abstract String getDescription();
} public class BigSize extends Size {
Beverage beverage; public BigSize(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription();
} @Override
public double cost() {
return 0.30+beverage.cost();
}
} public class MiddleSize extends Size {
Beverage beverage; public MiddleSize(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription();
} @Override
public double cost() {
return 0.20+beverage.cost();
}
} public class SmalleSize extends Size {
Beverage beverage; public SmalleSize(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription();
} @Override
public double cost() {
return 0.10+beverage.cost();
}
}

 4)测试代码---生产订单:

public class StarbuzzCoffee {
public static void main(String[] args) {
Beverage beverage1 = new Espresso(); //订一杯Espresso,不添加任何调料
System.out.println(beverage1.getDescription()+":$"+beverage1.cost()); Beverage beverage2 = new HouseBlend(); //订一杯HouseBlend,不添加任何调料
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2); //两份摩卡
System.out.println(beverage2.getDescription()+"(double Mocha):$"+beverage2.cost()); beverage2 = new Soy(beverage2); //再加一份soy
System.out.println(beverage2.getDescription()+"(additional Soy):$"+beverage2.cost()); beverage2 = new Whip(beverage2); //再加一份whip
System.out.println(beverage2.getDescription()+"(additional Whip):$"+beverage2.cost()); beverage2 = new MiddleSize(beverage2); //选择中杯
System.out.println(beverage2.getDescription()+"(choose middleSize):$"+beverage2.cost());
}
}

 测试结果:

Espresso:$1.99
HouseBlend(double Mocha):$1.29
HouseBlend(additional Soy):$1.59
HouseBlend(additional Whip):$1.99
HouseBlend(choose middleSize):$2.19

 

 

JAVA设计模式---装饰者模式的更多相关文章

  1. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  2. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  3. 从源码角度理解Java设计模式——装饰者模式

    一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...

  4. 【设计模式】Java设计模式 - 装饰者模式

    Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...

  5. JAVA 设计模式 装饰者模式

    用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构

  6. Java 设计模式—装饰者模式

    在Java编程语言中,嵌套了非常多设计模式的思想,比如IO流中的缓冲流就使用到以下要介绍的装饰者设计模式. 演示样例代码: * 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类 * @autho ...

  7. Java设计模式の装饰者模式

    目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮 ...

  8. Java设计模式--装饰器模式到Java IO 流

    装饰器模式 抽象构件角色:给出一个抽象接口,以规范准备接受附加责任的对象. 具体构件角色:定义准备接受附加责任的对象. 抽象装饰角色:持有一个构件对象的实例,并对应一个与抽象构件接口一致的接口. 具体 ...

  9. 设计模式-装饰者模式(Decorator Pattern)

    本文由@呆代待殆原创,转载请注明出处. 此设计模式遵循的设计原则之一:类应该支持扩展,而拒绝修改(Open-Closed Principle) 装饰者模式简述 装饰者模式通过组合的方式扩展对象的特性, ...

随机推荐

  1. 循序渐进之Spring AOP(1) - 原理

    AOP全称是Aspect Oriented Programing,通常译为面向切面编程.利用AOP可以对面向对象编程做很好的补充. 用生活中的改装车比喻,工厂用面向对象的方法制造好汽车后,车主往往有些 ...

  2. 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码

    Problem A: pigofzhou的巧克力棒 Description 众所周知,pigofzhou有许多妹子.有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们.具体 ...

  3. BZOJ 1041: [HAOI2008]圆上的整点【数论,解方程】

    1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4210  Solved: 1908[Submit][Sta ...

  4. NowCoderWannafly挑战赛5-可编程拖拉机比赛-向上取整和向下取整函数

    可编程拖拉机比赛 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 65536K,其他语言131072K64bit IO Format: %lld 题目描述 "这个比赛,归根结底 ...

  5. MongoDB基本命令操作

    在上一篇随笔中记录了如何在Centos7上安装MongoDB数据库,这一篇我们就一起来学学基本的操作命令. 安装完成后,shell交互式下输入mongo就可以直接无密码登录到数据库. show dbs ...

  6. Kafka入门介绍

    1. Kafka入门介绍 1.1 Apache Kafka是一个分布式的流平台.这到底意味着什么? 我们认为,一个流平台具有三个关键能力: ① 发布和订阅消息.在这方面,它类似一个消息队列或企业消息系 ...

  7. 多文件中的static

    这里借鉴一篇文章:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html#undefined 在这里举个例子,先和你说说 ...

  8. alert一般用来调试客户端的javascript代码,以及更好的调试方法

    alert一般用来调试客户端的javascript代码 调试利器--console.log 如今主流浏览器(Chrome,IE8及后续版本,FireFox,Opera等)都支持控制台功能. Chrom ...

  9. 导入Mybatis_Spring项目遇到的问题

    1.  问题: jdk版本不匹配  解决方法:首先 到项目空间的   .setting文件中找到  org.eclipse.wst.common.project.facet.core.xml  修改参 ...

  10. mybatis_SQL映射(2)

    文章摘录自:http://blog.csdn.net/y172158950/article/details/17258377 1. sql的重用:定义一个sql片段,可在任何SQL语句中重用该片段. ...