【设计模式】装饰者模式Decorator(Java)
创始人
2024-04-23 05:31:55
0

文章目录

  • 1. 装饰者模式定义
  • 2. 类图
  • 3.Java实现
    • 3.1 饮料Beverage
    • 3.2 小料CondimentDecorator
    • 3.3 椰果Coconut
    • 3.4 红豆RedBean
    • 3.5 奶茶MikeTea
    • 3.6 果茶JuiceTea
    • 3.7 商店主方法StoreMain

1. 装饰者模式定义

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

2. 类图

在这里插入图片描述

  • 装饰者和被装饰者对象有相同的超类型
  • 可用一个或多个装饰者包装一个对象
  • 装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的
  • 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用你喜欢的装饰者来装饰对象

3.Java实现

奶茶店制作饮料,可以动态的添加小料如椰果等,同时将小料的价格附加到奶茶上。
在这里插入图片描述

  • 饮料Beverage:果茶JuiceTea、奶茶MikeTea
  • 小料CondimentDecorator:椰果Coconut、红豆RedBean

在这里插入图片描述

3.1 饮料Beverage

相同的超类型

package Decorator;/*** Componet:抽象类之饮料*/
public abstract class Beverage {String desprition = "Unkonwn Beverage";public String getDesprition(){return desprition;}public abstract double cost();
}

3.2 小料CondimentDecorator

package Decorator;/*** Decorator:抽象类之小料*/
public abstract class CondimentDecorator extends Beverage {public abstract String getDesprition();
}

3.3 椰果Coconut

价格:1元

package Decorator;/*** ConcreteDecoratorA:椰果* 用于装饰Component*/
public class Coconut extends CondimentDecorator{Beverage beverage;public Coconut(Beverage beverage){this.beverage = beverage;}@Overridepublic double cost() {return 1 + beverage.cost();}@Overridepublic String getDesprition() {return beverage.getDesprition() + ", Coconut";}
}

3.4 红豆RedBean

价格:1元

package Decorator;/*** ConcreteDecoratorB:红豆* 用于装饰Component*/
public class RedBean extends CondimentDecorator{Beverage beverage;public RedBean(Beverage beverage){this.beverage = beverage;}@Overridepublic double cost() {return 1 + beverage.cost();}@Overridepublic String getDesprition() {return beverage.getDesprition() + ", RedBean";}
}

3.5 奶茶MikeTea

价格:8元

package Decorator;/*** ConcreteComponent:奶茶*/
public class MikeTea extends Beverage{public MikeTea(){desprition = "MikeTea";}@Overridepublic double cost() {return 8;}
}

3.6 果茶JuiceTea

价格:10元

package Decorator;/*** ConcreteComponent:果茶*/
public class JuiceTea extends Beverage{public JuiceTea(){desprition = "JuiceTea";}@Overridepublic double cost() {return 10;}
}

3.7 商店主方法StoreMain

package Decorator;/*** 测试主方法:制作饮料*/
public class StoreMain {public static void main(String[] args) {/*** 创建果茶*/Beverage beverage = new JuiceTea();System.out.println(beverage.getDesprition()+" ¥"+beverage.cost());/*** 创建果茶,并添加椰果*/Beverage beverage2 = new JuiceTea();beverage2 = new Coconut(beverage2); // 添加椰果(添加装饰)System.out.println(beverage2.getDesprition()+" ¥"+beverage2.cost());/*** 创建奶茶,并添加椰果和红豆*/Beverage beverage3 = new MikeTea();beverage3 = new Coconut(beverage3);// 添加椰果beverage3 = new RedBean(beverage3);// 添加红豆System.out.println(beverage3.getDesprition()+" ¥"+beverage3.cost());}
}

运行结果:

在这里插入图片描述

参考文献:《Head First设计模式(中文版)》弗里曼

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...