定义装饰者模式

装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。这句话摘自书中,给人读得很生硬难懂。通俗地来说,装饰者和被装饰者有相同的父类,装饰者的行为组装着被装饰者的行为。

设计星巴克咖啡

代码实现

/**
* @author Lollipop
* @since 2019/11/26
*/
public abstract class Beverage {
String description = "Unknown Beverage"; public String getDescription() {
return description;
} public abstract double cost(); }
/**
* @author Lollipop
* @since 2019/11/26
*/
public abstract class CondimentDecorator extends Beverage {
/**
* 描述
* @return
*/
@Override
public abstract String getDescription();
}
/**
* @author Lollipop
* @since 2019/11/26
*/
public class Mocha extends CondimentDecorator {
private Beverage beverage; public Mocha(Beverage beverage) {
this.beverage = beverage;
} /**
* 描述
*
* @return
*/
@Override
public String getDescription() {
return "Mocha," + this.beverage.getDescription();
} @Override
public double cost() {
return 0.20 + this.beverage.cost();
}
}
/**
* @author Lollipop
* @since 2019/11/26
*/
public class Whip extends CondimentDecorator {
private Beverage beverage; public Whip(Beverage beverage) {
this.beverage = beverage;
} /**
* 描述
*
* @return
*/
@Override
public String getDescription() {
return "Whip," + this.beverage.getDescription();
} @Override
public double cost() {
return 0.10 + this.beverage.cost();
}
}

代码运行

/**
* @author Lollipop
* @since 2019/11/26
*/
public class StarbuzzCoffee {
public static void main(String[] args) {
Beverage beverage = new Espress();
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
System.out.println(beverage.getDescription() + " $" + beverage.cost());
}
}

运行结果

Whip,Mocha,Mocha,Unknown Beverage $1.59

总结

  1. 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。
  2. 多重嵌套,导致代码复杂度高

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

  1. 读headFirst设计模式 - 装饰者模式

    继承可以在复用父类代码的情况下扩展父类的功能,但同时继承增加了对象之间的耦合度,所以要慎用继承.那么有没有既能扩展父类的功能,又能使对象间解耦的方法呢?答案是肯定的,这就是我们今天要学习的装饰者模式. ...

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

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

  3. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  4. HeadFirst设计模式<2>

    HeadFirst设计模式<2> 1 装饰者模式 星巴克咖啡 饮料 总结 如果说策略模式是通过组合实现弹性,那么装饰者模式就是通过继承来实现,在实现的同时,客户基本感觉不到使用了装饰者模式 ...

  5. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---适配器模式之TurkeyAdapter[转]

    适配器模式的主要意图是对现有类的接口进行转换,以满足目标类的需求.其次,可以给目标类的接口添加新的行为(主要指方法).这一点容易与装饰模式混淆.从意图方面来看,装饰模式不改变(通常指增加)接口中的行为 ...

  6. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]

     1  2{<HeadFirst设计模式>之装饰模式 }  3{ 本单元中的类为被装饰者         }  4{ 编译工具: Delphi7.0          }  5{ E-Ma ...

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

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

  8. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  9. 《HeadFirst设计模式》读后感——对学习设计模式的一些想法

    最近看完了<HeadFirst设计模式>,GOF的<设计模式——可复用面向对象软件的基础>的创建型模式也读完了,经历了从一无所知到茅塞顿开再到充满迷惑的过程. 不得不说< ...

随机推荐

  1. Springboot中定时器的简单使用

    在定时器的类上添加注解: @Component@EnableAsync@EnableScheduling 一.普通的定时器: 每天15:10执行的定时器 @Scheduled(cron="0 ...

  2. centOS7安装mysql8.0完美教程!!只要按照步骤,无脑操作,一次成功!

    查看防火墙systemctl status firewalld重启防火墙systemctl start firewalld 1.mysql 首先关闭防火墙 systemctl stop firewal ...

  3. RDPGuard6.1.7之后的问题

    RDPGuard是一款保护远程桌面RDP端口不被暴力猜解的软件,说下在使用RDP Guard中遇到的一些问题: 1.似乎D版RDPGuard 6.1.7或之后的版本,启用IP Cloud会自动将大量I ...

  4. 迎国庆 itest(爱测试) 4.1.0 发布,开源BUG 跟踪管理 & 敏捷测试管理软件

    v4.1.0 下载地址 :itest下载 itest 简介:查看简介 在线体验 https://itest.work/demo/ V4.1.0 根据用户反馈,共增加了23个更新:其中有11个功能增强和 ...

  5. hibernate之主键生成策略

    1. hibernate的主键生成器: generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 . 连接数据库的xml hibernate.cfg.xml <?xml ...

  6. 高频Python面试题分享

    一.Python语言中你用过哪些方式来实现进程间通信1.队列Queue 2.Pipe管道 只适用于两个进程之间的通信, pipe的效率高于queue 3.共享内存 4.socket套接字(UDP即可) ...

  7. Shell编程——运算符

    1.declare命令: 声明变量的类型: -:给变量设定类型属性 +:给变量取消类型属性 -i:将变量声明为整数类型 -x:将变量声明为环境变量 -p:显示变量的类型 其中export是将num变为 ...

  8. hw笔试题-02

    #include<stdio.h> #include<string.h> typedef struct { char *mem; char len; }m_table_t; i ...

  9. 【转】Linux设置定时任务方法

    设置:每天4点运行脚本/var/x/web/train/modeltrain [root@T-XXX-ML-01 log]# crontab -e0 4 * * * /var/x/web/train/ ...

  10. 谈谈vue.js中methods watch和compute的区别和联系

    methods,watch和computed都是以函数为基础的,但各自却都不同: 1.watch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个数据(称它为依 ...