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