一、装饰者模式
动态地将责任附加到对象上。想要扩展功能,装饰提供有别于继承的另一种选择。
二、举例
设计一个饮料类,要求如下
- 有饮料的名称,价格
- 可以给饮料加配料
饮料类
package com.jackeys.DecoratorMode;
/**
* @Description: 饮料类
* @ClassName: Beverage
* @Package com.jackeys.DecoratorMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/7 9:22
* @Version: 1.0
*/
public abstract class Beverage {
/**
* 饮料描述
*/
String description = "未知饮料";
/**
* 返回饮料描述
* @return String
*/
public String getDescription() {
return this.description;
}
/**
* 计算价格
* @return double
*/
public abstract double cost();
}
装饰者类
package com.jackeys.DecoratorMode;
/**
* @Description: 调料类,装饰者类
* @ClassName: Condiment
* @Package com.jackeys.DecoratorMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/7 9:25
* @Version: 1.0
*/
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription();
}
深度烘焙咖啡类
package com.jackeys.DecoratorMode;
/**
* @Description: 深度烘焙咖啡
* @ClassName: DarkRoast
* @Package com.jackeys.DecoratorMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/7 9:47
* @Version: 1.0
*/
public class DarkRoast extends Beverage{
public DarkRoast(){
this.description="深度烘焙咖啡";
}
@Override
public double cost() {
return 0.89;
}
}
意大利浓咖啡类
package com.jackeys.DecoratorMode;
/**
* @Description: 意大利浓咖啡
* @ClassName: Espresso
* @Package com.jackeys.DecoratorMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/7 9:28
* @Version: 1.0
*/
public class Espresso extends Beverage{
public Espresso(){
this.description="意大利浓咖啡";
}
@Override
public double cost() {
return 1.99;
}
}
混合咖啡类
package com.jackeys.DecoratorMode;
/**
* @Description: 混合咖啡
* @ClassName: HouseBlend
* @Package com.jackeys.DecoratorMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/7 9:31
* @Version: 1.0
*/
public class HouseBlend extends Beverage{
public HouseBlend(){
this.description="混合咖啡";
}
@Override
public double cost() {
return 0.89;
}
}
摩卡类
package com.jackeys.DecoratorMode;
/**
* @Description: 摩卡
* @ClassName: Mocha
* @Package com.jackeys.DecoratorMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/7 9:33
* @Version: 1.0
*/
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage){
this.beverage=beverage;
}
@Override
public double cost() {
return 0.20+this.beverage.cost();
}
@Override
public String getDescription() {
return this.beverage.getDescription()+",摩卡";
}
}
豆浆类
package com.jackeys.DecoratorMode;
/**
* @Description: 豆浆
* @ClassName: Soy
* @Package com.jackeys.DecoratorMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/7 9:35
* @Version: 1.0
*/
public class Soy extends CondimentDecorator {
Beverage beverage;
public Soy(Beverage beverage){
this.beverage=beverage;
}
@Override
public double cost() {
return 0.88+this.beverage.cost();
}
@Override
public String getDescription() {
return this.beverage.getDescription()+",豆浆";
}
}
奶泡类
package com.jackeys.DecoratorMode;
/**
* @Description: 奶泡
* @ClassName: Whip
* @Package com.jackeys.DecoratorMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/7 9:40
* @Version: 1.0
*/
public class Whip extends CondimentDecorator{
Beverage beverage;
public Whip(Beverage beverage){
this.beverage=beverage;
}
@Override
public double cost() {
return 0.77+this.beverage.cost();
}
@Override
public String getDescription() {
return this.beverage.getDescription()+",奶泡";
}
}
测试类
package com.jackeys.DecoratorMode;
/**
* @Description: 测试装饰者模式
* @ClassName: Test
* @Package com.jackeys.DecoratorMode
* @Author: Jackeys 1623427047@qq.com
* @Copyright 版权归Jackeys企业(或个人)所有
* @CreateTime: 2021/10/7 9:43
* @Version: 1.0
*/
public class Test {
public static void main(String[] args) {
Beverage beverage1=new Espresso();
System.out.println(beverage1.getDescription()+"的价格是"+beverage1.cost()+"美元");
System.out.println("===========================");
Beverage beverage2=new DarkRoast();
beverage2=new Mocha(beverage2);
beverage2=new Mocha(beverage2);
beverage2=new Whip(beverage2);
System.out.println(beverage2.getDescription()+"的价格是"+beverage2.cost()+"美元");
System.out.println("===========================");
Beverage beverage3=new HouseBlend();
beverage3=new Soy(beverage3);
beverage3=new Mocha(beverage3);
beverage3=new Whip(beverage3);
System.out.println(beverage3.getDescription()+"的价格是"+beverage3.cost()+"美元");
System.out.println("===========================");
}
}
输出