开放原则:类应该对扩展开放,对修改关闭。

  - 上篇博客中的观察者模式中,通过加入新的观察者,我们可以在任何时候扩展主题(Subject),而且不需向主题中添加代码。

  - 装饰者模式也完全遵循开放原则。

装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

  记住:是你,还有你,一切拜托你。

    是你:包装类继承(或实现)被包装类

    还有你:包装类包含被包装类的一个实例

      一切拜托你:非增强方法全部拜托 被包装类的实例来完成

    增强方法:根据需求重写方法

 代码

/**
* 饮料
* @author oy
* @date 2019年8月28日 下午11:07:33
* @version 1.0.0
*/ public abstract class Beverage {
public String description; public String getDescription() {
return description;
} public abstract double cost(); // 其他方法
public abstract String method1();
}

  CondimentDecorator

/**
* 装饰类 = 饮料 + 调料
* @author oy
* @date 2019年8月28日 下午11:13:55
* @version 1.0.0
*/
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription(); // 空实现
public String method1() {
return "";
}
}

  Espresso

/**
* 浓缩咖啡
*/
public class Espresso extends Beverage { public Espresso() {
description = "Espresso";
} @Override
public double cost() {
return 1.0;
} @Override
public String method1() {
return "Espresso method1()";
}
}

  HouseBlend

/**
* House Blend Coffee*/
public class HouseBlend extends Beverage { public HouseBlend() {
description = "House Blend Coffee";
} @Override
public double cost() {
return 2.0; } @Override
public String method1() {
// TODO Auto-generated method stub
return "HouseBlend method1()";
}
}

  Mocha

/**
* 具体的装饰类:是你,还有你,一切拜托你。*/ public class Mocha extends CondimentDecorator {//是你:Mocha是Beverage类型 Beverage beverage; // 还有你:Mocha包含Beverage的对象实例 public Mocha(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription() + ", Mocha";
} // 一切拜托你:Beverage的不需要增强的方法全部拜托给beverage对象来处理
@Override
public String method1() {
return beverage.method1();
} // 重写增强方法
@Override
public double cost() {
return 0.20 + beverage.cost();
}
}

  Whip

/**
* 具体的装饰类:是你,还有你,一切拜托你。
* @author oy
* @date 2019年9月1日 上午10:06:53
* @version 1.0.0
*/
public class Whip extends CondimentDecorator {//是你 Beverage beverage; // 还有你 public Whip(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription() + ", Whip";
} @Override
public String method1() {
return beverage.method1();
} // 增强方法
@Override
public double cost() {
return 0.30 + beverage.cost();
}
}

  测试代码

public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());
System.out.println(beverage.method1()); // 用摩卡装饰Espresso(浓缩饮料)
Beverage mocha = new Mocha(beverage);
System.out.println(mocha.getDescription() + " $" + mocha.cost());
System.out.println(mocha.method1());
// 还可以继续装饰mocha
mocha = new Whip(mocha);
System.out.println(mocha.getDescription() + " $" + mocha.cost());
System.out.println(mocha.method1());
}

  打印结果:

Espresso $1.0
Espresso method1()
Espresso, Mocha $1.2
Espresso method1()
Espresso, Mocha, Whip $1.5
Espresso method1()

head first 设计模式笔记3-装饰者模式:星巴兹饮料的更多相关文章

  1. JAVA设计模式之【装饰者模式】

    JAVA设计模式之[装饰者模式] 装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装 ...

  2. 【读书笔记】读《JavaScript设计模式》之装饰者模式

    一.定义 装饰者模式可用来透明地把对象包装在具有同样接口的另一个对象之中.这样一来,你可以给一个方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者对象是一种更灵活的选择(装 ...

  3. 《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式

    装饰者模式是JDK中还有一个使用较多的设计模式,上一个是观察者模式(在Swing中大量使用),业内好的API设计无一离不开常见的设计模式,通常我们所说要阅读源代码,也是为了学习大牛们的设计思路.--- ...

  4. HeadFirst设计模式读书笔记(3)-装饰者模式(Decorator Pattern)

    装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超 ...

  5. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  6. 设计模式学习心得<装饰器模式 Decorator>

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

  7. 设计模式のDecoratorPattern(装饰器模式)----结构模式

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

  8. 设计模式C++实现——装饰者模式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/walkerkalr/article/details/28633123 模式定义:         装 ...

  9. 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...

  10. 《Head First 设计模式》之装饰者模式

    作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5922248.html 模式名称 装饰者模式(Decorator Pattern) 需求 定义咖啡厅中的 ...

随机推荐

  1. 【STM32】NVIC中断优先级管理

    (1)NVIC中断优先级分组 1>,CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且 具有256级的可编程中断设置. 2>,STM32F4并没有使用CM4的内核 ...

  2. 什么是PWA

    什么是PWA:https://www.jianshu.com/p/299c9c720e56 2019前端必会黑科技之PWA:https://www.jianshu.com/p/098af61bbe04 ...

  3. C++多线程基础学习笔记(七)

    一.std::async和std::future的用法 std::async是一个函数模板,std::future是一个类模板 #include <iostream> #include & ...

  4. C++练习 | 单链表的创建与输出(结构体格式)

    #include <iostream> #include <stdio.h> using namespace std; #define OK 1 #define ERROR 0 ...

  5. JavaScript Let 和 Const

    来源:菜鸟教程:https://www.runoob.com/js/js-let-const.html JavaScript let 和 const ECMAScript 2015(ECMAScrip ...

  6. Python简单主机批量管理工具

    一.程序介绍 需求: 简单主机批量管理工具 需求: 1.主机分组 2.主机信息使用配置文件 3.可批量执行命令.发送文件,结果实时返回 4.主机用户名密码.端口可以不同 5.执行远程命令使用param ...

  7. CentOS 7 安装ActiveMQ

    今天给大家介绍一下 CentOS 7 下如何安装ActiveMQ,每个步骤均为亲自己操作后记录.下面我们开始吧. 1.首先进入自己的目录下面,创建并进入 activeMQ 文件夹(mkdir acti ...

  8. 在CentOS 7系统下升级 Jenkins版本

    使用yum方式安装的war文件路径:/usr/lib/jenkins/jenkins.war 查看war包所在的目录 find / -name jenkins.war 停止Jenkins 服务 sys ...

  9. java中的重写总结

    这个理解了就挺容易的~~ 我就直接贴个程序啦 ,程序里有说明!! 父类: package ParentAndSon; public class Parent extends Object {//4:以 ...

  10. mac下开启phpredis扩展

    下载 官网下载php合适的版本:http://pecl.php.net/package/redis 这里我的php版本:7.1.23,下载的phpredis版本:5.0.0 配置安装 解包.重命名 s ...