装饰模式定义:
在不改变原来类的基础上,动态的对这个类进行添加或者是删减功能的一种模式
在装饰模式中主要有四个角色组成:
抽象构件:定义一个接口或者是抽象类,规范接收的附加责任的对象
具体构件:定义一个将要接收附加责任的类
装饰角色:注入一个抽象构件的类,并且实现与构件的接口
具体装饰角色:负责给构件对象贴上“附加"标签
具体的代码格式如下:
这里主要是以火锅锅底的为一个例子来讲述装饰模式的
/**
* @Author: Jason
* @Create: 2019/12/28 19:16
* @Description 装饰模式中的火锅锅底
* 抽象构件
*/
public interface GuoDi {
//这里只是设计到火锅的锅底结果,
double price(double price);
//以及锅底名称
String name(String name);
}
/**
* @Author: Jason
* @Create: 2019/12/28 19:19
* @Description 鸳鸯火锅
* 具体构件
*/
public class YuanYang implements GuoDi {
@Override
public double price(double price) {
return price;
}
@Override
public String name(String name) {
return name;
}
}
/**
* @Author: Jason
* @Create: 2019/12/28 19:21
* @Description 配菜
* 装饰角色
*/
public class PeiCay implements GuoDi{
private GuoDi guoDi;
public PeiCay(GuoDi guoDi){
super();
this.guoDi = guoDi;
}
@Override
public double price(double price) {
return guoDi.price(price);
}
@Override
public String name(String name) {
return guoDi.name(name);
}
}
/**
* @Author: Jason
* @Create: 2019/12/28 19:28
* @Description 大白菜
* 具体的装饰角色
*/
public class DaBaiCai extends PeiCay {
public DaBaiCai(GuoDi guoDi) {
super(guoDi);
}
@Override
public double price(double price) {
return super.price(price) + 20;
}
@Override
public String name(String name) {
return super.name(name) + "添加一味大白菜配菜";
}
}
/**
* @Author: Jason
* @Create: 2019/12/28 19:34
* @Description 装饰模式的代码测试
*/
public class GuoDi {
public static void main(String[] args) {
//点了一份鸳鸯锅底
YuanYang guoDi = new YuanYang();
String name = guoDi.name("鸳鸯锅底");
Double peice = guoDi.price(300);
//然后再加上一份配菜
DaBaiCai daBaiCai = new DaBaiCai(guoDi);
//计算出总价钱
String totalCaiMing = daBaiCai.name(name);
Double totalPrice = daBaiCai.price(peice);
System.out.println(totalCaiMing);
System.out.println("总价格为:" + totalPrice);
}
}
装饰模式总结:在装饰模式中主要的一个功能-就是对一个对象不断进行功能的拓展,在不影响前面的类的情况下进行的