设计模式-装饰器模式

定义:向一个现有的对象添加新的功能,同时又不改变其结构,动态地给一个对象添加一些额外的职责。

个人理解:比如说奶茶吧,它的原料就是奶和茶的融合体(被装饰对象),现在有一个装饰器(可以添加珍珠、布丁、红豆),给被装饰对象装饰一下(添加不同的食材),就变成了新的对象(珍珠奶茶···),但是它的底层奶和茶的底层没有被改变。

UML图解:

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:如果给被装饰类多层装饰,比较复杂。

代码:

用奶茶举例

public class Main {
    public static void main(String[] args) {
        //只要一杯奶茶,不加任何材料
        Component component = new ComponentImpl();
        component.createMilkTea();
        //来一杯布丁奶茶
        Component component2 = new PuddingDecorator(new ComponentImpl());
        component2.createMilkTea();
    }


}
//被装饰类(主体)的抽象
interface Component {
    //生产奶茶
    void createMilkTea();
}
//被装饰类的具体实现
class ComponentImpl implements Component{

    @Override
    public void createMilkTea() {
        System.out.println("我在制作奶茶底料");
    }
}
//装饰器的抽象类,实现了Component,从外类来扩展Component类的功能
abstract class Decorator implements Component{
    Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    //重写被装饰类的方法
    @Override
    public void createMilkTea(){
        System.out.println("这是装饰器");
        component.createMilkTea();
    }
}
//具体的装饰器
class PuddingDecorator extends Decorator{
    //添加要装饰的东西
    private String material;
    //构造方法
    public PuddingDecorator(Component component) {
        super(component);
    }
    //具体的方法
    @Override
    public void createMilkTea() {
        super.createMilkTea();
        //添加材料
        material = "布丁";
        System.out.println("我现在是一杯布丁奶茶了");
    }
}

 


总结:装饰器模式使用的场景,多用于动态的添加,动态的撤销,只需要把具体的职责划分好,同时继承装饰者模式即可。

最后感谢:https://blog.csdn.net/zaoan_2010/article/details/83308891 所提供的UML图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值