装饰器模式
定义:
在不改变原有对象的基础上,将功能附加到对象上。
装饰器模式可以动态给对象添加一些额外的职责从而实现功能的拓展,在运行时选择不同的装饰器,从而实现不同的行为;比使用继承更加灵活,通过对不同的装饰类进行排列组合,创造出很多不同行为,得到功能更为强大的对象;符合“开闭原则”,被装饰类与装饰类独立变化,用户可以根据需要增加新的装饰类和被装饰类,在使用时再对其进行组合,原有代码无须改变。
应用场景:
扩展一个类的功能或给一个类附加职责。
当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能,也就是这些功能在编译时就需要确定了。那么有什么更好的方式实现功能的拓展吗?答案就是装饰器模式。
优点:
1)不改变原有对象的情况下,扩展新功能。
2)使用不同组合可以实现不同效果。
3)符合开闭原则。
代码示例:
Component:抽象构件,是定义一个对象接口,可以给这个对象动态地添加职责。
ConcreteComponent:具体构件,是定义了一个具体的对象,也可以给这个对象添加一些职责。
Decorator:抽象装饰类,继承自 Component,从外类来扩展 Component 类的功能,但对于Component 来说,是无需知道 Decorator 存在的。
ConcreteDecorator:具体装饰类,起到给 Component 添加职责的功能。
package com.test;
public class DecoratorMode {
public static void main(String[] args) {
// 使用相机拍照功能
Component component = new ConcreteComponent();
component.camera();
// 使用相机的拍照和美颜功能
component = new ConcreteDecorator(new ConcreteComponent());
component.camera();
// 使用相机的拍照、美颜和滤镜功能
component = new ConcreteDecorator1(new ConcreteDecorator(new ConcreteComponent()));
component.camera();
}
}
// 定义被装饰者,以手机相机为例
interface Component{
void camera();
}
// 最原始只有拍照功能
class ConcreteComponent implements Component{
public void camera() {
System.out.println("拍照功能...");
}
}
abstract class Decorator implements Component{
Component component;
public Decorator(Component component) {
this.component = component;
}
}
// 添加美颜功能
class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Component component) {
super(component);
}
public void camera() {
// 调用原始方法
component.camera();
System.out.println("美颜功能...");
}
}
// 添加滤镜功能
class ConcreteDecorator1 extends Decorator{
public ConcreteDecorator1(Component component) {
super(component);
}
public void camera() {
// 调用原始方法
component.camera();
System.out.println("滤镜功能...");
}
}