装饰模式:动态的将责任附加到对象上,想要扩展功能,装饰者提供有别于继承的另一种选择。

1,创建顶级类

package com.pattern.decorate;

public abstract class Beverage {

	String description = "Unknown Beverage";

	public String getDescription(){
return description;
} public abstract double cost();
}

2,创建产品类

package com.pattern.decorate;

public class Espresso extends Beverage{

	public Espresso(){
description = "Espresso";
}
/**
* @see com.pattern.decorate.Beverage#cost()
*/
@Override
public double cost() {
return 1.99;
}
}
package com.pattern.decorate;

public class HouseBlend extends Beverage{

	public HouseBlend(){
description = "House Blend Coffee";
} /**
* @see com.pattern.decorate.Beverage#cost()
*/
@Override
public double cost() {
return .89;
} }
package com.pattern.decorate;

public class DarkRoast extends Beverage {

	public DarkRoast(){
description = "DarkRoast";
}
/**
* @see com.pattern.decorate.Beverage#cost()
*/
@Override
public double cost() {
return 2.99;
} }

3,创建装饰类

package com.pattern.decorate;

public abstract class CondimentDecorator extends Beverage{

	public abstract String getDescription();
}

4,创建装饰类的具体实现类

package com.pattern.decorate;

public  class Whip extends CondimentDecorator {

	public Beverage beverage;

	public Whip(Beverage beverage) {
this.beverage = beverage;
} /**
* @see com.pattern.decorate.CondimentDecorator#getDescription()
*/
@Override
public String getDescription() {
return beverage.getDescription()+", Whip";
} /**
* @see com.pattern.decorate.Beverage#cost()
*/
@Override
public double cost() {
return .30+beverage.cost();
} }
package com.pattern.decorate;

public class Mocha extends CondimentDecorator{

	Beverage beverage;

	public Mocha(Beverage beverage){
this.beverage = beverage;
} /**
* @see com.pattern.decorate.CondimentDecorator#getDescription()
*/
@Override
public String getDescription() {
return beverage.getDescription()+", Mocha";
} /**
* @see com.pattern.decorate.Beverage#cost()
*/
@Override
public double cost() {
return .20+beverage.cost();
} }

5,测试

package com.pattern.decorate;

public class StarbuzzCoffee {

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

上图装饰类与被装饰类 具有共同的父类。

其实也可以不具有相同的父类!

Java设计模式(三) 装饰模式的更多相关文章

  1. JAVA设计模式:装饰模式

    前面我们学习了代理模式: 代理模式主要使用了java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你 ...

  2. java设计模式之装饰模式

    发现设计模式的学习越来越让自己学习的东西太少了,应该多接触一些东西,多出去走一走. 装饰模式概念: 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活(大话设计模式) 在不 ...

  3. Java——设计模式(装饰模式_IO)

     /* * 装饰设计模式: *  对一组对象的功能进行增强时,就可以使用该模式进行问题的解决; * 装饰和继承都能实现一样的特点:  就是进行功能的扩转增强. * */ public class  ...

  4. Java设计模式之装饰模式趣谈

    本文由码农网 – 鲁阿皓原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 前情提要:http://blog.csdn.net/baidu_30889437/article/details/ ...

  5. java设计模式---三种工厂模式之间的区别

    简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...

  6. java设计模式三种工厂模式简单介绍

    一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...

  7. java设计模式(三)--抽象工厂模式

    转载:http://zz563143188.iteye.com/blog/1847029 前面的工厂方法模式虽然清晰,但还是感觉有些繁琐,通常使用的还是抽象工厂模式. 工厂方法模式有一个问题就是,类的 ...

  8. java设计模式(装饰模式)

    装饰模式实现了可以动态地为原对象扩展方法 装饰对象与被装饰的都实现了同一个接口(或抽象类) 举个例子: 工作 可以边吃东西边工作,也可以边喝东西边工作,还可以工作的时候边吃边喝 创建共同接口 Work ...

  9. java设计模式---三种工厂模式

    工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...

  10. Java设计模式(三) Visitor(訪问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...

随机推荐

  1. 嵌入式Linux驱动学习之路(六)u-boot启动内核

    内核启动是需要必要的启动参数.不能开机自动完全从0开始启动,需要uboot帮助内核实现重定位并提供参数. 首先,uboo会从Kernel分区中读取bootcmd环境变量,根据环境变量可自动启动. 分区 ...

  2. 渗透攻防工具篇-后渗透阶段的Meterpreter

    作者:坏蛋链接:https://zhuanlan.zhihu.com/p/23677530来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 前言 熟悉Metasploit ...

  3. 报错问题:InnoDB: Error: log file ./ib_logfile0 is of different size

    InnoDB: Error: log file ./ib_logfile0 is of different size bytesInnoDB: than specified in the .cnf f ...

  4. Java daemon thread 守护线程

    守护线程与普通线程写法上基本么啥区别,在启动线程前, 调用线程对象的方法setDaemon(true),则可以将其设置为守护线程. 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收.内存 ...

  5. 十个节省时间的MySQL命令

    十个节省时间的MySQL命令 2011-02-23 16:07 黄永兵 译 IT168 字号:T | T 编者在工作中积累起来了一些MySQL命令行客户端技巧,这些技巧或多或少会帮助您节省大量的时间. ...

  6. JS给文本框赋值后,在页面后台取不到文本框值的解决方法

    转自:http://www.cnblogs.com/qiaohd/archive/2012/03/23/2413660.html (ReadOnly.disabled 都有可能造成取值取不到) 开发一 ...

  7. 微软职位内部推荐-SDEII_ ECO

    微软近期Open的职位: SDE II SDE II Organization Summary: Engineering, Customer interactions & Online (EC ...

  8. CentOS VMware 下SSH配置方法详解

    1.安装SSH[root@sample ~]# yum install ssh2.启动SSH[root@sample ~]# service sshd start3.设置开机运行[root@sampl ...

  9. MPI+WIN10并行试运行

    系统:2015 win10专业版 x64 MPI安装包:mpich2-1.4.1p1-win-x86-64.man 将后缀改为.msi 以管理员身份安装 安装过程一路默认,注意<behappy为 ...

  10. Java反射机制可以动态修改实例中final修饰的成员变量吗?

    问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...