目录
一、基本概念
二、角色设计
三、代码实现
四、总结
一、基本概念
装饰器模式是指不必在改变原有的类和不使用继承的情况下,动态扩展一个对象的功能。
二、角色设计
角色 | 描述 |
---|---|
抽象构件 | 是一个接口或者抽象类,定义我们最核心的对象 |
基础构件 | 抽象构件的实现,可以单独用,也可以将其进行装饰 |
装饰角色 | 一般是一个抽象类,继承自或实现抽象构件,在它的属性中有个变量指向抽象构建,这是关键 |
具体装饰角色 | Type-C充电和Wireless充电是两个具体的装饰类,可以把基础构件进行装饰,延伸出新的功能 |
三、代码实现
假设一个场景,以前手机充电只有usb充电,但是目前手机多出了2种新的充电方式,Typc-C和无线充电,这就需要我们动态去扩展功能,让我们看看装饰器如何实现的。
1、首先定义一个基本的充电接口,采用usb充电
public interface Charge {public void usb();}
2、实现一个普通手机去使用usb接口充电
public class PhoneCharge implements Charge{@Overridepublic void usb() {System.out.println("采用usb接口充电...");}}
3、 抽象的充电装饰器
public abstract class AbstractPhoneDecorator implements Charge{protected final Charge charge;public AbstractPhoneDecorator(Charge charge){this.charge = charge;}}
4、Type-C充电具体装饰
public class TypeCDecorator extends AbstractPhoneDecorator{public TypeCDecorator(Charge charge) {super(charge);}@Overridepublic void usb() {super.charge.usb();System.out.println("采用type-c接口充电...");}}
5、无线充电的具体装饰
public class WirelessDecorator extends AbstractPhoneDecorator{public WirelessDecorator(Charge charge) {super(charge);}@Overridepublic void usb() {super.charge.usb();System.out.println("采用无线充电...");}}
6、测试类
public static void main(String[] args) {Charge charge = new PhoneCharge();TypeCDecorator typeCDecorator = new TypeCDecorator(charge);WirelessDecorator wirelessDecorator = new WirelessDecorator(typeCDecorator);wirelessDecorator.usb();}
7、运行结果
四、总结
优点:装饰类和被装饰类可以独立发展,降低了耦合,可以动态去扩展一个实现类的功能
缺点:装饰器模式会增加许多的子类,会使代码繁多增加程序复杂性