概念
在不改变原有对象的基础之上,将功能附加到对象上。提供了比继承更有弹性的替代方案(扩展原有对象功能)
适用场景
- 扩展一个类的功能或者给一个类添加附加职责
- 给一个对象动态的添加功能,或动态撤销功能。
优点
- 继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能。
- 通过使用不同装饰类以及这些类的排列组合,可以实现不同的效果。
- 符合开闭原则
缺点
- 会出现更多的代码,更多的类,增加程序的复杂性。
- 动态装饰时,多层装饰时会更复杂。(使用继承来拓展功能会增加类的数量,使用装饰者模式不会像继承那样增加那么多类的数量但是会增加对象的数量,当对象的数量增加到一定的级别时,无疑会大大增加我们代码调试的难度
使用步骤:
- 装饰者和被装饰者实现同一个接口或者继承同一个类
- 装饰着中要有被装饰者的引用
- 对需要增强的方法进行加强
- 对不需要加强的方法调用原来的方法
先定义一个车接口
public interface Car {
void run();
void stop();
}
QQ车对车进行实现
public class QQ implements Car{
@Override
public void run(){
System.out.println("qq在跑");
}
@Override
public void stop(){
System.out.println("正常停止");
}
}
创建实现接口的装饰者模式类对QQ车进行修改
public class CarWarp implements Car {
private Car car;
public CarWarp(Car car){
this.car=car;
}
@Override
public void run(){
//可以修改原来的方法car.run();
System.out.println("5秒破百");
}
@Override
public void stop(){
car.stop();
System.out.println("根本停不下来");
}
}
测试类和结果
public class TTT {
public static void main(String[] args){
QQ qq=new QQ();
/*qq.run();
qq.stop();*/
CarWarp warp=new CarWarp(qq);
warp.run();
warp.stop();
}
}
结果:
5秒破百
正常停止
根本停不下来