装饰者:动态的将新功能附加到对象上
装饰者模式定义:
1)装饰者模式:动态的将新功能附加到对象上 在对象功能扩展方面 他比继承更加有弹性 装饰者模式也体现了开闭原则(OCP)
2)这里提到的动态的将新功能附加到对象那个和OCP原则 在应用实例上会以代码的形式体现
一个使用装饰者模式的小demo:解决星巴克咖啡订单问题分析
两种对象:
1、被装饰者(单品咖啡) 2、装饰者(咖啡)(对象里面可以包含被装饰者)
这两者产生关系 产生==》主体 component
//一个饮品类
package com.ljb.starbucksproblem;
/**
* Copyright (C), 2022-2030, Chongqing Mac info. Co., Ltd.
*
* @author Sw_Ljb
* @version 1.0
* @ClassName Drink
* @Date 2022/4/21下午3:35
*/
public abstract class Drink {
public String des;
public float price=0.0f;
public void setDes(String des) {
this.des = des;
}
public void setPrice(float price) {
this.price = price;
}
public String getDes() {
return des;
}
public float getPrice() {
return price;
}
public abstract float cost();
}
package com.ljb.starbucksproblem;
/**
* Copyright (C), 2022-2030, Chongqing Mac info. Co., Ltd.
*
* @author Sw_Ljb
* @version 1.0
* @ClassName Coff
* @Date 2022/4/21下午3:36
*/
public class Coff extends Drink{
@Override
public float cost() {
return super.getPrice();
}
}
//单品
package com.ljb.starbucksproblem;
/**
* Copyright (C), 2022-2030, Chongqing Mac info. Co., Ltd.
*
* @author Sw_Ljb
* @version 1.0
* @ClassName Decaf
* @Date 2022/4/21下午3:42
*/
public class Decaf extends Coff{
void Decaf(){
setDes("Decaf");
setPrice(4.0f);
}
}
package com.ljb.starbucksproblem;
/**
* Copyright (C), 2022-2030, Chongqing Mac info. Co., Ltd.
*
* @author Sw_Ljb
* @version 1.0
* @ClassName Espresso
* @Date 2022/4/21下午3:43
*/
public class Espresso extends Coff{
public Espresso() {
setDes("Espresso");
setPrice(5.0f);
}
}
package com.ljb.starbucksproblem;
/**
* Copyright (C), 2022-2030, Chongqing Mac info. Co., Ltd.
*
* @author Sw_Ljb
* @version 1.0
* @ClassName ShortBlack
* @Date 2022/4/21下午3:40
*/
public class ShortBlack extends Coff{
public ShortBlack(){
setDes("ShortBlack");
setPrice(3.0f);
}
}
//装饰者类
package com.ljb.starbucksproblem;
import java.lang.reflect.Field;
/**
* Copyright (C), 2022-2030, Chongqing Mac info. Co., Ltd.
*
* @author Sw_Ljb
* @version 1.0
* @ClassName Decorator
* @Date 2022/4/21下午3:44
*/
public class Decorator extends Drink{
private Drink drink;
public Decorator(Drink drink){
this.drink = drink;
}
@Override
public float cost() {
//getPrice自己的加个
return super.getPrice()+drink.cost();
}
@Override
public String getDes(){
return super.des+" "+super.getPrice()+"&&"+drink.getDes();
}
}
package com.ljb.starbucksproblem;
/**
* Copyright (C), 2022-2030, Chongqing Mac info. Co., Ltd.
*
* @author Sw_Ljb
* @version 1.0
* @ClassName Chocolac
* @Date 2022/4/21下午3:55
*/
public class Chocolac extends Decorator{
public Chocolac(Drink drink) {
super(drink);
setDes("Chocolac");
setPrice(4.0f);
}
}
package com.ljb.starbucksproblem;
/**
* Copyright (C), 2022-2030, Chongqing Mac info. Co., Ltd.
*
* @author Sw_Ljb
* @version 1.0
* @ClassName Milk
* @Date 2022/4/21下午3:54
*/
public class Milk extends Decorator{
public Milk(Drink drink) {
super(drink);
setDes("Milk");
setPrice(3.0f);
}
}
//一个消费者
package com.ljb.starbucksproblem;
/**
* Copyright (C), 2022-2030, Chongqing Mac info. Co., Ltd.
*
* @author Sw_Ljb
* @version 1.0
* @ClassName Customers
* @Date 2022/4/21下午3:55
*/
public class Customers {
public static void main(String[] args) {
Drink order = new Espresso();
order= new Milk(order);
//掉一份Espresso 加一个牛奶
System.out.println("一份Espresso:"+order.getDes());
System.out.println("费用一"+order.cost());
System.out.println("==================");
order =new Chocolac(order);
System.out.println("一份Espresso:"+order.getDes());
System.out.println("费用一"+order.cost());
}
}
递归==〉包裹的叠