小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
看了上文中的案例,相信大家都已经自己实践过了,接下来我们就把装饰模式的实现方式双手奉上。
第一步:创建奶茶接口类
public interface MilkTea {
//返回奶茶描述
public String getDescription();
//返回价格
public double getPrice();
}
第二步:创建两个具体的奶茶类:巧克力奶茶,QQ奶茶
public class ChocolateMT implements MilkTea {
private String description = "巧克力奶茶";
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return 15;
}
}
public class QQMT implements MilkTea {
private String description = "QQ奶茶!";
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return 10;
}
}
第三步:创建奶茶种类的装饰类
public class Decorator implements MilkTea {
private String description = "我只是装饰器,不知道是哪种奶茶";
@Override
public String getDescription() {
return description;
}
@Override
public double getPrice() {
return 0; //价格由种类来决定
}
}
第四步:具体装饰类:给奶茶加入椰果
public class Coconut extends Decorator{
private String description = "加了椰果!";
private MilkTea milkTea = null;
public Coconut(MilkTea milkTea){
this.milkTea = milkTea;
}
public String getDescription(){
return milkTea.getDescription()+"\n"+description;
}
public double getPrice(){
return milkTea.getPrice()+3; //3表示椰果的价格
}
}
第五步:具体装饰类:给奶茶加入布丁
public class Pudding extends Decorator{
private String description = "加了布丁!";
private MilkTea milkTea = null;
public Pudding(MilkTea milkTea){
this.milkTea = milkTea;
}
public String getDescription(){
return milkTea.getDescription()+"\n"+description;
}
public double getPrice(){
return milkTea.getPrice()+5; //5表示布丁的价格
}
}
第六步:具体装饰类:给奶茶加入珍珠
public class Pearl extends Decorator{
private String description = "加了珍珠!";
private MilkTea milkTea = null;
public Pearl(MilkTea milkTea){
this.milkTea = milkTea;
}
public String getDescription(){
return milkTea.getDescription()+"\n"+description;
}
public double getPrice(){
return milkTea.getPrice()+10; //10表示珍珠的价格
}
}
第七步:测试类
public class Test {
public static void main(String[] args) {
MilkTea milkTea = new ChocolateMT(); //选择了巧克力奶茶
milkTea = new Pudding(milkTea); //为巧克力奶茶添加布丁
milkTea = new Coconut(milkTea); //为巧克力奶茶添加椰果
System.out.println(milkTea.getDescription()+"\n加了布丁和椰果的巧克力奶茶价格:"+milkTea.getPrice());
}
}
测试结果
阿Q手工画图画出了装饰模式的类图,大家可以参考类图仔细研究一下。
如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!