设计模式之装饰者模式

设计模式

设计模式之装饰者模式


原理

  1. 装饰者模式就像打包一个快递
    主体:比如:陶瓷、衣服(Component) //被装饰者
    包装:比如:报纸填充、塑料泡沫、纸板、木板(Decorator)
  2. Component主体:比如类似前面的Drink
  3. ConcreteComponent 和 Decorator
    ConcreteComponent:具体的主体,
    比如前面的各个单品咖啡
  4. Decorator:装饰者,比如各调料.
    在如图的Component与ConcreteComponent之间,如果ConcreteComponent类很多,还可以设计一个缓冲层,将 共有的部分提取出来,抽象层一个类。

中间的继承箭头反了

在这里插入图片描述


代码

1.创建Drink抽象类:

package parent;

public abstract class Drink {
	public String dec;
	private double cost=0;

	public String getDec() {
		return dec;
	}

	public void setDec(String dec) {
		this.dec = dec;
	}

	public double getCost() {
		return cost;
	}

	public void setCost(double cost) {
		this.cost = cost;
	}

	public abstract double cost() ;

}

2.创建Coffee类:

package parent;

public class Coffee extends Drink{

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

	@Override
	public String getDec() {
		return super.getDec()+"[]"+super.getCost();
	}
}

3.创建Decorator类:

package parent;

public class Decorator extends Drink{
	private Drink drink;

	public Decorator(Drink drink,String des,double cost) {
		this.drink = drink;
		setDec(des);
		setCost(cost);
	}

	@Override
	public double cost() {
		return super.getCost()+drink.cost();
	}

	@Override
	public String getDec() {
		return super.getDec()+"[]"+super.getCost()+"[]"+drink.getDec();
	}
}

4.创建Coffee实例:

package parent;

public class EspressoCoffee extends Coffee{
	public EspressoCoffee() {
		setDec("意大利咖啡");
		setCost(3);
	}
}

package parent;

public class LongCoffee extends Coffee{
	public LongCoffee() {
		setDec("长咖啡");
		setCost(6);
	}
}

5.创建Decorator实例:

package parent;

public class Chocolate extends Decorator{
	public Chocolate(Drink drink) {
		super(drink, "巧克力", 1);
	}
}

package parent;

public class Milk extends Decorator{
	public Milk(Drink drink) {
		super(drink, "牛奶", 2);
	}
}


6.调用:

package parent;

public class Client {
	public static void main(String[] args) {
		LongCoffee longCoffee = new LongCoffee();
		Milk milk = new Milk(longCoffee);
		Chocolate chocolate = new Chocolate(milk);

		System.out.println("价格是:"+chocolate.getDec()+":"+chocolate.cost());
	}
}


总结

使用场景:动态地给一些对象添加一些额外的职责但又不想增加子类,功能随时组合
优点:

  • Decorator 模式与继承关系的目的都是要扩展对象的功能,但是 Decorator 可以提供比继承更多的灵活性。
  • 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计者可以创造出很多不同行为的组合。

缺点:

  • 用导致架构复杂:这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值