Java设计模式 - 装饰者模式

1. 定义

动态地将责任附加到对象上,在扩展功能时,该模式提供了比继承更有弹性的替代方案。

2. 角色

  • Component:抽象构件
  • ConcreteComponent:具体构件
  • Decorator:抽象装饰类,是抽象构件的子类,内部持有对Component实例的一个引用
  • ConcreteDecorator:具体装饰类

3. 特点

  • 优点:用该模式来实现扩展比使用继承灵活,有较好的松耦合性,可以对用户以透明的方式动态地给对象附加更多的责任。
  • 缺点:该模式会产生许多小对象,出错时排错比较繁琐,需要逐级排查。

4. 示例

Drink:

public abstract class Drink {

    String name;

    public String getName() {
        return name;
    }

    public abstract int cost();
}

Condiment:

public abstract class Condiment extends Drink {

    public abstract String getName(); 
    // 因为所有调料都要重新实现该方法,因此将该方法改为抽象方法
}

MilkTea:

public class MilkTea extends Drink {

    public MilkTea() {
        name = "奶茶";
    }

    @Override
    public int cost() {
        return 20;
    }
}

具体调料实现类:

// ZhenZhu
public class ZhenZhu extends Condiment {

    Drink drink;

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

    public String getName() {
        return drink.getName() + "珍珠";
    }

    @Override
    public int cost() {
        return drink.cost() + 3;
    }
}


// NaiGai
public class NaiGai extends Condiment {

    Drink drink;

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

    public String getName() {
        return drink.getName() + "奶盖";
    }

    @Override
    public int cost() {
        return drink.cost() + 4;
    }
}

测试类:

public class TestDecorator {

    public static void main(String[] args) {

        Drink drink = new NaiGai(new ZhenZhu(new MilkTea()));
        System.out.println(drink.getName());
        System.out.println(drink.cost());
    }
}


// 输出
// 奶茶珍珠奶盖
// 27

 

参考:
1. 《Head First 设计模式》

2. 《图说设计模式》 https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/decorator.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值