package pattern;
public class StarbuzzCoffee {
public static void main(String args[]) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + "$" + beverage.cost(0.5));
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription() + "$" + beverage2.cost(0.5));
Beverage beverage3 = new HouseBlend();
beverage3.setDiscounts(true);
beverage3.setSize(beverage.TALL);
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription() + "$" + beverage3.cost(0.5));
}
}
abstract class Beverage {
public static int TALL = 10;
public static int GRANDE = 20;
public static int VENTI = 30;
public int size = VENTI;
public boolean isDiscounts=false;
public int getSize() {
return size;
}
public void setSize(int insize) {
size = insize;
}
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
public abstract double cost(double discounts);
public boolean isDiscounts() {
return isDiscounts;
}
public void setDiscounts(boolean isDiscounts) {
this.isDiscounts = isDiscounts;
}
}
abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost(double discounts) {
if(isDiscounts){
return 1.99*discounts;
}
return 1.99;
}
}
class DarkRoast extends Beverage {
public DarkRoast() {
description = "DarkRoast";
}
public double cost(double discounts) {
if(isDiscounts){
return 0.99*discounts;
}
return 0.99;
}
}
class HouseBlend extends Beverage {
public HouseBlend() {
description = "House Blend Coffee";
}
public double cost(double discounts) {
if(isDiscounts){
return .89*discounts;
}
return .89;
}
}
class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ",Mocha";
}
public double cost(double discounts) {
return .20 + beverage.cost(discounts);
}
}
class Whip extends CondimentDecorator {
Beverage beverage;
public Whip(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ",Whip";
}
public double cost(double discounts) {
return .20 + beverage.cost(discounts);
}
}
class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage) {
this.beverage = beverage;
}
public int getSize() {
return beverage.getSize();
}
public String getDescription() {
return beverage.getDescription() + ",Soy";
}
public double cost(double discounts) {
double cost = beverage.cost(discounts);
if (getSize() == Beverage.TALL) {
cost += .10;
} else if (getSize() == Beverage.GRANDE) {
cost += .15;
} else if (getSize() == Beverage.VENTI) {
cost += .20;
}
return cost;
}
}
装饰着模式--动态地讲责任附加到对象上。想要扩展功能,装饰着提供有别于继承的另一种选择。
继承属于扩展形式之一,但是不见得是达到弹性设计的最佳方案。
在我们的设计中,应该允许行为可以被扩展,而无须修改现有代码。
组和合委托可用于在运行时动态地加上新的行为。
除了继承装饰着模式也可以让我们扩展行为。
装饰者模式意味着一群装饰者类,这些类用来包装具体组件。
装饰者 可以在被被装饰者的行为前面或者与后面加上自己的行为,甚至将被装饰者的行为整个替换,而达到特定的目的。
可以用无数的装饰者包装一个组件。
装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。
装饰者会导致设计中出现很多小对象,如果过度使用,会让程序变得复杂。
装饰者模式 有点类似墙壁和染料,墙壁类似被装饰者,染料类似装饰者,我们可以给墙上涂上无穷的染料,而改变墙壁的颜色。或者类似人和衣服, 人为被装饰者 ,衣服为装饰者,衣服不停装饰人,人的外形就会改变,如果衣服有飞的功能,那么人就会飞了。
分享到:
相关推荐
结构型模式则涉及如何组合类和对象,包括适配器、桥接、组合、装饰器、外观、享元和迭代器模式,它们提供了增强结构和解耦的手段。行为型模式专注于类或对象间的交互和职责分配,如模板方法、命令、解释器、责任链、...
设计模式Golang实现《研磨设计模式》读书笔记Go语言设计模式Go语言设计模式的实例代码创建模式工厂简单模式(Simple Factory)工厂方法模式(工厂方法)抽象工厂模式(Abstract Factory)创建者模式(Builder)原型...
在《JAVA与模式读书笔记》中,我们探讨的是Java编程语言与设计模式的结合应用,这对于深入理解面向对象编程和提升软件开发能力至关重要。设计模式是软件工程中的最佳实践,它们是解决常见问题的模板,可以提高代码的...
2. 结构型模式:包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。它们处理对象之间的关系,如组合...
9. **职责链模式**:行为型设计模式,将请求的发送者和接收者解耦,使得多个对象都有可能处理请求。请求沿着链传递,直到有对象处理它为止。在日志系统中,职责链模式可以用来决定哪些级别的消息需要记录。 10. **...
IO系统解构有装饰者设计模式息息相关,所以先从分析它们的关系:
读书笔记PPT模板则是为读者提供了一种整理、展示和分享阅读心得的有效工具。简约扁平化的设计风格,既符合现代审美趋势,也使得内容更加突出,避免了繁复的装饰干扰视线,让重点信息一目了然。喜庆的红色元素则可能...
- **Go语言设计模式**:如工厂模式、单例模式、装饰器模式等在Go语言中的实现。 - **Go语言性能调优**:如何利用工具分析和优化Go程序的性能。 - **Go语言的最佳实践**:如何编写符合Go语言风格的代码,遵循Go语言的...
23种设计模式是面试中常见的考点,包括单例模式、工厂模式、代理模式、装饰器模式等,理解其应用场景和实现方式。 七、框架与工具 1. **前端框架**:React、Vue、Angular的使用和原理,以及CSS预处理器如Sass、...
Android源码设计模式解析与实战读书笔记源代码 说明: 包名factorypattern.normal表示的是工厂方法模式的普通用法 包名factorypattern.practices表示的是工厂方法模式的常用 包名observerpattern表示的是观察者模式...
《自学Python:编程基础、科学计算及数据分析》读书笔记模板.pptx 本资源是一本关于Python编程的读书笔记模板,共10章,涵盖了Python的编程基础、科学计算和数据分析等方面的知识点。下面是该资源的详细知识点: ...
这份"《如何高效学习》读书笔记扁平风格ppt模板"则是对书籍内容的精彩提炼,旨在帮助读者更好地理解和应用书中的核心概念。 扁平设计是一种简洁、直观的设计风格,它强调去除多余的装饰元素,使信息传递更为清晰。...
- 在某些场景下,如使用代理或装饰者模式时,可能需要在构造完成后动态添加行为,此时使用方法注入更为灵活。 ##### 2. 各层次异常处理体系构建 - **概述**:Spring 提供了多种方式来处理不同层级的异常,包括控制...
刘晓军的设计模式读书笔记汇总可能涵盖了对这些模式的深入理解和应用示例,帮助读者更好地掌握如何在实际项目中运用这些模式。整体心得文档可能会提供作者在学习过程中对设计模式的整体理解和感悟,包括哪些模式在何...
Kotlin允许为已有类添加新功能,而无需继承或使用装饰者模式。扩展函数和扩展属性使得在不修改原有类的情况下增加功能成为可能。 7. **协程**: 协程是一种并发编程机制,它解决了异步编程中的回调地狱问题,提供...
4. **装饰者模式**:动态地给对象添加新的职责,比继承更具弹性。C++中,通过组合而非继承可以实现装饰者模式。 5. **适配器模式**:将不兼容的接口转换为可使用的接口。在C++中,可以使用继承或者包含来实现适配器...
8. **设计模式**:书中可能会提及一些常见的设计模式,如工厂模式、观察者模式、装饰器模式等,这些模式是解决常见问题的通用解决方案,能够提升代码的灵活性和可扩展性。 9. **代码的整洁**:整洁的代码不仅意味着...
单例模式 , 工厂模式 , 装饰者模式 , 代理模式 ... Java基础核心 JVM , 集合 , 类型 ,关键字... Java高级特性 多线程、锁、并发 框架 Spring , Mybatis , SpringBoot , SpringMVC ... 中间件 RPC , MQ , elastic...
第一部分 序幕 第1章 Python数据类型 普通方法、特殊方法 第二部分 数据结构 ...第6章 使用一等函数实现设计模式 第7章 函数装饰器和闭包 从定位参数到仅限关键字函数 函数修饰器与闭包 装饰器基础知识 装饰器何时执
装饰模式 享元模式 桥接模式 第二部分 [JavaSE(Java基础)] [JVM(Java虚拟机)] 第三部分 [DataStructure(数据结构)] 链表 字符串 树 图 [排序] 查找 《剑指Offer》 《程序员面试金典》 《LeetCode》 《程序员代码面试...