装饰者模式_设计模式_java

装饰者设计模式:
可以解决类爆炸的问题和cop原则
比如如果是一个卖咖啡的商店,去卖不同种类的咖啡,有黑咖啡,意大利咖啡,还可以加入很多调理的话.
如果用传统的面向对象的方法的话会使得类爆炸。
如果引用装饰者模式可以动态的增加方法。使得类自动建造
原来的方案
装饰者模式_设计模式_java

这里有装饰者和被装饰者。以前我们都是咖啡上加入调理,现在我们是调理中加入咖啡

装饰者模式_设计模式_java
装饰者模式_设计模式_java
Drink.java

public abstract class Drink {
	public String des;
	private float price = 0.0f;
	public String getDes() {
		return des;
	}
	public void setDes(String des) {
		this.des = des;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public abstract float cost();
}

Coffee.java

public class Coffee extends Drink{

	@Override
	public float cost() {
		// TODO 自动生成的方法存根
		return super.getPrice();
	}

}

ECoffee.java

public class ECoffee extends Coffee{
	public ECoffee() {
		setDes("意大利咖啡");
		setPrice(4.0f);
	}

}

BlackCoffee.java

public class BlackCoffee extends Coffee{
	public BlackCoffee() {
		setDes("黑咖啡");
		setPrice(5.0f);
		
	}

}

装饰者:
Decorator.java

public class Decorator extends Drink{
	private Drink obj;
	public Decorator(Drink obj) {
		//组合
		this.obj = obj;
		// TODO 自动生成的构造函数存根
	}
	@Override
	public float cost() {
		// TODO 自动生成的方法存根
		
		return super.getPrice()+obj.cost();
	}
	@Override
	public String getDes() {
		// TODO 自动生成的方法存根
		return super.des + " " + super.getPrice()+ " " + obj.getDes();
	}
	
}

调理:巧克力

public class Chocolate extends Decorator{

	public Chocolate(Drink obj) {
		super(obj);
		setDes("巧克力");
		setPrice(1.0f);
		// TODO 自动生成的构造函数存根
	}

}

调理:牛奶

public class Milk extends Decorator{

	public Milk(Drink obj) {
		
		
		super(obj);
		setDes("牛奶");
		setPrice(2.0f);
		// TODO 自动生成的构造函数存根
	}

}

咖啡店:

public class CoffeeBar {
	public static void main(String[] args) {
		Drink drink1 = new BlackCoffee();
		System.out.println(drink1.cost());
		System.out.println(drink1.getDes());
		drink1 = new Milk(drink1);
		System.out.println(drink1.cost());
		System.out.println(drink1.getDes());
	}

}

输出结果:
装饰者模式_设计模式_java
动态添加价格以及描述信息

在JDK中的IO流中应用到装饰者模式。

上一篇:简单工厂和静态工厂模式


下一篇:Java---抽象定义及举例