装饰器设计模式是一种结构型的设计模式,它允许我们在运行时动态地给一个对象添加额外的行为,并且不需要修改原有的类。它可以有效地避免类爆炸问题,提高代码的可维护性和复用性。同时,装饰器模式也具有灵活、可扩展和易于维护等优点,是一种非常实用和常用的设计模式。
使用装饰器模式时,我们将新增的行为包装在一个装饰器类中,与原有类具有相同的接口。这个装饰器类可以包含一个对于原有类的引用,在调用原有类的方法之前或之后执行额外的逻辑,从而实现对原有类的增强。
装饰器模式的核心思想就是「包装」,通过不断地向对象上叠加新的行为,使得对象具有了更多的功能和特性,同时保持了对象的原有接口和结构不变。
下面是装饰器模式的几个要点:
装饰器设计模式的应用场景
装饰器设计模式是一种结构型设计模式,它允许在运行时动态地扩展一个对象的功能。
以下是一些装饰器设计模式的应用场景:
下面是一个常见的使用装饰器设计模式的例子:
package cn.leetcode;
public interface Drink {
String description();
float cost();
}
package cn.leetcode;
public abstract class Decorator implements Drink{
/**
* 要装饰的对象
*/
private Drink drink;
public Decorator(Drink drink){
this.drink = drink;
}
@Override
public String description() {
return drink.description();
}
@Override
public float cost() {
return drink.cost();
}
}
package cn.leetcode;
public class SoyaBeanMilk implements Drink {
@Override
public String description() {
return "纯豆浆";
}
@Override
public float cost() {
return 5f;
}
}
package cn.leetcode;
public class BlackBeanDecorator extends Decorator {
public BlackBeanDecorator(Drink drink) {
super(drink);
}
@Override
public String description() {
return super.description() + " + 黑豆";
}
@Override
public float cost() {
return super.cost() + 3.0f;
}
}
package cn.leetcode;
public class EggDecorator extends Decorator {
public EggDecorator(Drink drink) {
super(drink);
}
@Override
public String description() {
return super.description() + " + 鸡蛋";
}
@Override
public float cost() {
return super.cost() + 2.0f;
}
}
package cn.leetcode;
public class SugarDecorator extends Decorator {
public SugarDecorator(Drink drink) {
super(drink);
}
@Override
public String description() {
return super.description() + " + 糖";
}
@Override
public float cost() {
return super.cost() + 0.5f;
}
}
package cn.leetcode;
public class Client {
public static void main(String[] args) {
// 子类纯豆浆:包在最里面
Drink soya = new SoyaBeanMilk();
// 在豆浆中加鸡蛋
EggDecorator eggSoya = new EggDecorator(soya);
// 在加了鸡蛋的豆浆中加糖
SugarDecorator sugarEggSoya = new SugarDecorator(eggSoya);
// 加了糖的豆浆中加黑豆
BlackBeanDecorator blackBeanSugarEggSoya = new BlackBeanDecorator(sugarEggSoya);
System.out.println("顾客点的是:" + blackBeanSugarEggSoya.description());
System.out.println("顾客一共消费了 " + blackBeanSugarEggSoya.cost() + " 元");
}
}
输出:
顾客点的是:纯豆浆 + 鸡蛋 + 糖 + 黑豆
顾客一共消费了 10.5 元
总结
阅读量:2023
点赞量:0
收藏量:0