修饰者模式

1.简单介绍

装饰器模式(Decorator Pattern)也叫包装模式(Wrapper Pattern),是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。
属于结构型模式。

2.修饰器的优缺点

优点:
1、装饰器是继承的有力补充,比继承灵活,不改变原有对象的情况下动态地给一个对象扩展功能,即插即用。
2、通过使用不同装饰类以及这些装饰类的排列组合,可实现不同效果。
3、装饰器完全遵守开闭原则。

缺点:
1、会出现更多的代码,更多的类,增加程序复杂性。
2、动态装饰时,多层装饰时会更复杂

3.模式结构

在这里插入图片描述抽象构件(Component)角色:该角色用于规范需要装饰的对象(原始对象)。
具体构件(Concrete Component)角色:该角色实现抽象构件接口,定义一个需要装饰的原始类。
装饰(Decorator)角色:该角色持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
具体装饰(Concrete Decorator)角色:该角色负责对构件对象进行装饰。

3.案例分析

在奶茶店里面购买奶茶时,可以要求在其中加入各种调料,奶茶店会根据所加入的调料收取不同的费用,也就是说不同的奶茶与调料之间有多种组合方式,每种奶茶和调料都有不同的收费,设计一种方案,当用户选择了奶茶和调料后,能够计算出总费用,同时满足奶茶和调料的灵活组合性和易拓展性。
在这里插入图片描述
(1)抽象构件类Component,此处定义为Beverage.java
在这里插入图片描述
(2)具体构件类ConcreteComponent,此处表示被修饰的类,被增加功能和方法的类,此处定义一个MilkTea,可以定义多个,一个类代表一种可以被修饰的类
在这里插入图片描述
(3)抽象修饰类Decorator,此处定义为Decorator ,注意抽象修饰类和具体构件类都要继承抽象构件类,此处都要继承Beverage。
在这里插入图片描述
(4)具体的修饰者,此处定义两个,分别是Mocha 和Soy ,两个具体修饰者都继承了抽象修饰者,而且都包含了抽象构件类型的属性,这样的话就可以在其方法中,调用实现了抽象构件类型的类或者对象的方法,再结合本身的方法,最终达到多个类中方法的组合,实现了扩展功能的目的。
在这里插入图片描述
在这里插入图片描述
(5)主类
在这里插入图片描述
运行结果:
在这里插入图片描述

4.总结

(1)抽象构件、具体构件(被修饰类)、抽象修饰类和具体修饰类四个角色要全,其中具体构件和抽象修饰类都要继承抽象构件类

(2)具体修饰类中要包含一个抽象构件类类型的属性,抽象类变量可以引用实现了抽象类的类的变量,可以容易拓展,不易出错。

5.装饰器模式和代理模式对比

1、装饰器模式就是一种特殊的代理模式。
2、装饰器模式强调自身的功能扩展。
3、代理模式强调代理过程的控制.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值