设计模式之装饰者模式

文章介绍了装饰者模式的原理,通过Java代码展示了如何创建一个Drink抽象类、Coffee实现类、Decorator装饰类以及具体的装饰实例如Chocolate和Milk。装饰者模式用于动态地给对象添加职责,提供了比继承更灵活的扩展方式,但可能会增加架构的复杂性。

设计模式

设计模式之装饰者模式


原理

  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 可以提供比继承更多的灵活性。
  • 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计者可以创造出很多不同行为的组合。

缺点:

  • 用导致架构复杂:这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值