Java设计模式之装饰者模式
在开始之前,先简单了解一下什么是装饰者模式?装饰者模式好比你新买的iPhone13手机,他能正常运作,可以打电话,拍照,上网浏览CSDN,但是你又怕手机摔坏,于是你花钱去贴了一个手机膜,还买了手机壳,对于手机来说,他有了手机膜和手机壳,但是不会影响拍照和上网,那么这就算一个装饰,用手机膜和手机壳装饰了手机,但是没有改变手机原有的结构和功能,下面我用大家最常见的奶茶为例,详细讲解装饰者模式。
首先,大家可以看一下这张图片
结合这张图片,再结合代码,相信你会理解的更清楚
抽象类奶茶
/**
* @describe:抽象类奶茶
* @author: jiazl/
* @version:v1.0
* 2022/3/14 10:38
*/
public abstract class AbstractMilkTea {
/**
* 描述味道
* @return
*/
public abstract String descript();
/**
* 得到价格
* @return
*/
public abstract Integer getPrice();
}
实体类奶茶
import 装饰者模式.抽象类.AbstractMilkTea;
/**
* @describe:奶茶实体类
* @author: jiazl/
* @version:v1.0
* 2022/3/14 10:36
*/
public class MilkTea extends AbstractMilkTea {
@Override
public String descript() {
return "普通奶茶";
}
@Override
public Integer getPrice() {
return 7;
}
}
抽象装饰类
/**
* @describe:抽象装饰类
* @author: jiazl/
* @version:v1.0
* 2022/3/14 10:42
*/
public abstract class AbstractDecorator extends AbstractMilkTea{
/**
* 抽象奶茶类
*/
private AbstractMilkTea abstractMilkTea;
public AbstractDecorator(AbstractMilkTea abstractMilkTea) {
this.abstractMilkTea = abstractMilkTea;
}
@Override
public String descript() {
return abstractMilkTea.descript();
}
@Override
public Integer getPrice() {
return abstractMilkTea.getPrice();
}
}
装饰者
装饰者1
/**
* @describe:
* @author: jiazl/
* @version:v1.0
* 2022/3/14 10:46
*/
public class Decorator1 extends AbstractDecorator {
public Decorator1(AbstractMilkTea abstractMilkTea) {
super(abstractMilkTea);
}
@Override
public String descript() {
return super.descript()+"加布丁";
}
@Override
public Integer getPrice() {
return super.getPrice()+2;
}
}
装饰者2
/**
* @describe:
* @author: jiazl/
* @version:v1.0
* 2022/3/14 10:50
*/
public class Decorator2 extends AbstractDecorator {
public Decorator2(AbstractMilkTea abstractMilkTea) {
super(abstractMilkTea);
}
@Override
public String descript() {
return super.descript()+"去糖";
}
@Override
public Integer getPrice() {
return super.getPrice();
}
}
测试类
import 装饰者模式.实体类.MilkTea;
import 装饰者模式.装饰类.Decorator1;
import 装饰者模式.装饰类.Decorator2;
/**
* @describe:
* @author: jiazl/
* @version:v1.0
* 2022/3/14 10:51
*/
public class Test {
public static void main(String[] args) {
//实体类奶茶 什么小料都不加,类似于描述中的刚出场的iPhone13
MilkTea milkTea=new MilkTea();
System.out.println(milkTea.descript()+milkTea.getPrice());
//加布丁的奶茶 传入最基本的 需要加料的奶茶
Decorator1 decorator1=new Decorator1(milkTea);
System.out.println(decorator1.descript()+decorator1.getPrice());
//去糖的奶茶
Decorator2 decorator2=new Decorator2(milkTea);
System.out.println(decorator2.descript()+decorator2.getPrice());
//加布丁且去糖的奶茶
Decorator2 decorator2Test=new Decorator2(decorator1);
System.out.println(decorator2Test.descript()+decorator2Test.getPrice());
}
}
运行结果
大家可以把代码拷贝,结合图片运行,详细大家就能理解到装饰者模式的精髓了。