定义
装饰模式(Decorator Pattern)是一种比较常见的模式,其定义如下:Attach additional
responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible
alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。
就增加功能来说,装饰模式相比生成子类更为灵活。)
如何拓展一个类的功能呢?
1、直接在该类中添加功能,违背开闭原则
2、继承,可能会导致类膨胀
角色
- Component:是一个接口或者是抽象类,定义最核心的对象,也就是最原始的对象
- ConcreteComponent:是最核心、最原始、最基本的接口或抽象类的实现
- Decorator:一般是一个抽象类,实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个private变量指向Component抽象构件
- ConcreteDecorator:装饰类,把最核心的、最原始的、最基本的东西装饰成其他东西
个人理解
- Component:被包装的类的基类
- ConcreteComponent:被包装的类
- Decorator:包装器的基类
- ConcreteDecorator:具体的包装器
装饰器示例
角色component
public interface Car {
void run();
}
角色ConcreteComponent
public class Ben implements Car{
@Override
public void run() {
System.out.println("[奔驰大G]: GO GO GO。。。");
}
}
角色Decorator
public abstract class CarDecorator implements Car {
//对car进行包装
private Car car;
public CarDecorator(Car car) {
this.car = car;
}
@Override
public void run() {
this.car.run();
}
}
角色ConcreteDecorator
public class FlyCar extends CarDecorator{
public FlyCar(Car car) {
super(car);
}
@Override
public void run() {
System.out.println("开放飞天功能。。。");
super.run();
}
}
public class AutoDrive extends CarDecorator{
public AutoDrive(Car car) {
super(car);
}
@Override
public void run() {
System.out.println("自动驾驶功能。。。");
super.run();
}
}
装饰器的优缺点
优点
- 装饰模式可以动态地扩展一个类的功能
- 装饰模式是继承关系的一个替代方案。我们看装饰类Decorator,不管装饰多少层,返
回的对象还是Component,实现的还是is-a的关系 - 装饰类和被装饰类可以独立发展,而不会相互耦合
缺点
- 多层装饰比较复杂,因尽量减少装饰类的数量,以便降低系统的复杂度