设计模式之装饰模式(二)

863 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

看了上文中的案例,相信大家都已经自己实践过了,接下来我们就把装饰模式的实现方式双手奉上。

第一步:创建奶茶接口类

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可以加入技术交流群参与讨论呦!