装饰模式(Decorator Pattern) :动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。
应用场景
-
日志记录:通过在现有的类或方法中添加日志记录功能,可以方便地追踪应用的执行情况。可以通过装饰器模式在不改变原有逻辑的情况下,在方法执行前记录日志,或者在方法执行后记录日志。
-
缓存处理:通过在原有的类或方法中添加缓存功能,可以提高系统的性能。可以通过装饰器模式在方法执行前检查缓存中是否已经有结果,如果有则直接返回缓存的结果,如果没有则执行原有方法,然后将结果存入缓存。
-
权限验证:通过在原有的类或方法中添加权限验证功能,可以确保只有具有足够权限的用户才能执行相应的操作。可以通过装饰器模式在方法执行前验证用户的权限,如果权限符合要求则执行原有方法,否则抛出异常或者返回错误信息。
-
动态代理:通过装饰器模式可以实现动态代理,即在运行时创建一个实现了相同接口的代理对象,代理对象可以在不修改原有代码的情况下对方法进行增强或者添加额外的操作。
-
输入验证:通过在原有的方法中添加输入检查功能,可以确保输入的参数符合要求。可以通过装饰器模式在方法执行前对参数进行验证,如果参数合法则执行原有方法,否则抛出异常或者返回错误信息。
实例
变形金刚在变形之前是一辆汽车,它可以在陆地上移动。当它变成机器人之后除了能够在陆地上移动之外,还可以说话;如果需要,它还可以变成飞机,除了在陆地上移动还可以在天空中飞翔。
结构图
时序图
代码展示
Transform接口
public interface Transform {
void move();
}
Car类
public class Car implements Transform{
public Car() {
System.out.println("我是一辆车!");
}
@Override
public void move() {
System.out.println("在地上移动!");
System.out.println("-----------------------");
}
}
Changer类
public class Changer implements Transform{
Transform transform;
public Changer(Transform transform) {
this.transform = transform;
}
@Override
public void move() {
transform.move();
}
}
Airplane类
public class Airplane extends Changer{
public Airplane(Transform transform) {
super(transform);
System.out.println("变成飞机!");
}
public void fly(){
System.out.println("在天上飞!");
System.out.println("-----------------------");
}
}
Robot类
public class Robot extends Changer{
public Robot(Transform transform) {
super(transform);
System.out.println("变成机器人!");
}
public void say(){
System.out.println("会说话了!");
System.out.println("-----------------------");
}
}
Main类
public class Main {
public static void main(String[] args) {
Transform transform = new Car();
Transform transform1 = new Changer(transform);
transform1.move();
Airplane airplane = new Airplane(transform1);
airplane.fly();
Robot robot = new Robot(transform1);
robot.say();
}
}