IO原理剖析——装饰器设计模式

版权声明: https://blog.csdn.net/weixin_40072979/article/details/83624955

装饰器模式就像一个房子,要装修,要放家具,放各种装饰品一样的。每个都是一个独立的单元,把这些小的单元重新组合就可以变成一个新的东西。他的好处就是被一个复杂的事务拆分成很多小的部件,非常灵活。

举一个例子:

我们需要调一杯带蔗糖的咖啡,和一杯加入牛奶的咖啡;

1:共同的特性是他们都是饮料,这个饮料他有名字,有说明(价格等):定义一个Drink接口,

2: 这个饮料再具体点是一个咖啡,Coffee就是Drink的一个具体对象,同样有名字,说明等

3: 我们调制的新东西是需要在咖啡上进行的,都需要继承Coffee, 后续我们需要知道这个新产品的名字,说明等(价格),我们需要调用它的属性,所以需要引用Drink,读取Drink设置的属性;

4:我们需要调制的新产品只需要在3的基础上去调整就行了,就算是关于咖啡的一万种产品,也只需要在3的基础上操作。

package com.jianshun;
/**
 * 模拟咖啡
 * 1:抽象组件:需要装饰的抽象对象(接口或者抽象父类)
 * 2:具体组件:需要装饰的对象
 * 3:抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法
 * 4:具体装饰类:被装饰的对象
 * @author fanfan
 */
public class DecorateTeset2 {

	public static void main(String[] args) {
		Drink coffee = new Coffee();
		Drink suger = new Suger(coffee);//装饰
		System.out.println(suger.info()+"-->"+suger.cost());
		Drink milk = new Milk(coffee);;//装饰
		System.out.println(milk.info()+"-->"+milk.cost());
	}
}
//抽象组件
interface Drink{
	double cost();//费用
	String info();//说明
}
//具体组件
class Coffee implements Drink{
	private String name="原味咖啡";
	
	@Override
	public double cost() {
		return 10;
	}

	@Override
	public String info() {
		return name;
	}
}
//抽象装饰类
abstract class Decreate extends Coffee{
	private Drink drink;

	public Decreate(Drink drink) {
		this.drink = drink;
	}

	@Override
	public double cost() {
		return this.drink.cost();
	}

	@Override
	public String info() {
		return this.drink.info();
	}
}
//具体装饰类
class Milk extends Decreate{

	public Milk(Drink drink) {
		super(drink);
	}

	@Override
	public double cost() {
		return super.cost()*4;
	}

	@Override
	public String info() {
		return super.info()+"加入牛奶";
	}
}

class Suger extends Decreate{

	public Suger(Drink drink) {
		super(drink);
	}

	@Override
	public double cost() {
		return super.cost()*2;
	}

	@Override
	public String info() {
		return super.info()+"加入了蔗糖";
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40072979/article/details/83624955