Spring中使用到的设计模式(八)----装饰器模式

1. 装饰模式简介

1.1 简介

 装饰模式是为已有功能动态添加更多功能的一种方式。

 它把每个要装饰的功能都放在单独的类中,并让这个类包装它要装饰的对象,因此,当需要执行特殊行为的时候,客户端代码就可以在运行时根据需要有选择地、进行按顺序地使用装饰功能包装对象

在Java源码中典型的装饰者模式就是java I/O

1.2 意图

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

1.3 UML图

Spring中使用到的设计模式(八)----装饰器模式

1.4 优缺点

优点:

装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

1.5 应用实例

1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。

2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。

1.6 主要解决的问题

一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

1.7 应用场景

1、扩展一个类的功能。

2、动态增加功能,动态撤销。

1.8 注意事项

可代替继承。

2. 装饰模式的实现

//基类

public class Mecha {

public void fight() {

System.out.println("我是基类");

}

}

//这里装载了父类,用于其他类来装饰

public abstract class DecoMecha extends Mecha{

protected Mecha mecha;

public void decorete(Mecha mecha) {

this.mecha = mecha;

}

}

//装饰基类

public class FireMecha extends DecoMecha{

@Override

public void fight() {

System.out.println("FireMecha类装饰");

mecha.fight();

}

}

//装饰基类

public class FlyMecha extends DecoMecha{

@Override

public void fight() {

System.out.println("FlyMecha装饰");

mecha.fight();

}

}

//客户端

public class MainTest {

public static void main(String[] args) {

Mecha mecha = new Mecha();

//开始装载

FireMecha fireMecha = new FireMecha();

fireMecha.decorete(mecha);

FlyMecha flyMecha = new FlyMecha();

flyMecha.decorete(fireMecha);

flyMecha.fight();

}

}

//----------------控制台-----------------------

FlyMecha装饰

FireMecha类装饰

我是基类