模式定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。
模式结构
Component:组件对象的接口,可以给这些对象动态地增加职责。
ConcreteComponet:具体的组建对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责。
Decorator:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象。
ConcreteDecorator:实际的装饰器对象,实现具体要向被装饰对象添加的功能。
代码实现
//我们用颜色装饰下宝马车
public interface Car {
void detail();
}
public class BMW implements Car {
public void detail() {
System.out.println("宝马");
}
}
public class Decorator implements Car {
private Car car;
public Decorator(Car car) {
this.car = car;
}
public void detail() {
car.detail();
}
}
public class YellowCar extends Decorator {
public YellowCar(Car car) {
super(car);
}
@Override
public void detail() {
System.out.print("黄色");
super.detail();
}
}
public class BlackCar extends Decorator {
public BlackCar(Car car) {
super(car);
}
@Override
public void detail() {
System.out.print("黑色");
super.detail();
}
}
public class Client {
public static void main(String[] args) {
Car yellowCar =new YellowCar(new Decorator(new BMW()));
yellowCar.detail();
Car blackCar = new BlackCar(new Decorator(new BMW()));
blackCar.detail();
}
}
模式的优缺点
优点
比继承更灵活
从为对象添加功能的角度来看,装饰模式比继承更灵活。继承时静态的,而且一旦继承所有子类都有一样的功能。而装饰模式采用把功能分离到每个装饰器当中,然后通过对象组合的方式,在运行时动态地组合功能。更容易复用功能
装饰模式把一些列复杂的功能分散到每个装饰器当中,一般一个装饰器只实现一个功能,使实现装饰器变得简单,更重要的是这样有利于装饰器功能的复用,可以给一个对象添加多个同样的装饰器,也可以把一个装饰器用来装饰不同的对象。简化高层定义
装饰模式可以通过组合装饰器方式,为对象增添任意多的功能。因此在进行高层定义的时候,不用把所有的功能都定义出来,而是定义最基本的就可以了,可以在需要使用的时候,组合相应的装饰器来完成需要的功能。
缺点
- 会产生许多细力度的对象。
思考
模式本质:动态组合。
开发中的应用场景
如果需要在不影响其他对象的情况下,以动态、透明的方式给对象增加职责,可以失忆哦那个装饰模式,这几乎就是装饰模式的主要功能。
如果不适合使用子类来进行扩展的时候,可以考虑使用装饰模式。