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

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. NOIP2003加分二叉树[树 区间DP]

    题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...

  2. MSDN论坛被垃圾信息刷爆了!!!

    https://social.msdn.microsoft.com/Forums/zh-CN/caab1275-103e-470e-8888-ca39d1c48364/linehx2888?forum ...

  3. sturct2类型转化

    第三种struts2类型转换方式实例 1.convert.jsp <%@ page language="java" import="java.util.*" ...

  4. guava函数式编程

    [Google Guava] 4-函数式编程 原文链接 译文链接 译者:沈义扬,校对:丁一 注意事项 截至JDK7,Java中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果.预计JDK8中会有所 ...

  5. Java线上应用故障排查之二:高内存占用

    搞Java开发的,经常会碰到下面两种异常: 1.java.lang.OutOfMemoryError: PermGen space 2.java.lang.OutOfMemoryError: Java ...

  6. c# HttpClient禁止缓存

    using (var client = new HttpClient())             {                //方法1:                 CacheContr ...

  7. python子网拆分IP段

    # author: 阿辉枫情 import re import struct import socket def IPSplitBlocks(minip, maxip): result = [] Ju ...

  8. Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

    概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Ha ...

  9. IIS 应用程序池.NET40 重新注册

    32位的Windows:---------------------------------------------------------------------------1. 运行->cmd ...

  10. AsyncTask源码解析

    package com.example.demo.activity.net; import java.util.ArrayDeque; import java.util.concurrent.Bloc ...