装饰器模式可以字面理解,就是用来对某个功能进行装饰的,装饰就是在原来的基础上进行增加,生活中也有很多案例,帮助我们理解装饰器模式,例如挂相片这件事,我们打印好后相片,直接贴在墙上也可以,基础功能就满足需求了,但是如果给相片加上一个相框,就会看起来更加美观,看起来心情都更好了,这里面就有两个角色,相片是基础功能,相框是装饰角色。 装饰器模式有几个角色是必不可少的,分别有四个,如下
- 功能抽象角色,定义功能方法
- 具体功能实现角色,将抽象方法实现具体的业务逻辑
- 抽象装饰角色,继承/实现功能抽象角色定义的功能,但是不做装饰扩展
- 具体装饰角色,实现抽象装饰角色,实现具体的装饰逻辑
通过案例来说明,源码如下
功能抽象角色
public abstract class Component {
public abstract void method();
}
具体功能实现角色
public class ConcreteComponent extends Component {
@Override
public void method() {
System.out.println("我是基础功能。。。");
}
}
抽象装饰角色
public abstract class Decorator extends Component {
Component component;
protected Decorator(Component component) {
this.component = component;
}
@Override
public void method() {
component.method();
}
}
具体装饰角色
public class ConcreteDecorator extends Decorator {
public ConcreteDecorator(Component component) {
super(component);
}
@Override
public void method() {
//装饰功能
System.out.println("原逻辑调用前的装饰逻辑。。。");
//原始的方法逻辑
super.method();
//装饰功能
System.out.println("原逻辑调用后的装饰逻辑。。。");
}
}
所有的代码已经写完,我们测试一下,测试代码如下
public class Main {
public static void main(String[] args) {
Component component = new ConcreteComponent();
component.method();
System.out.println("=============分割线=============");
Component decorator = new ConcreteDecorator(component);
decorator.method();
}
}
执行main方法后,可以得到原有功能不变的情况下,对原有的功能进行了装饰,效果如下
到这里,装饰器模式就总结结束了。其实学习设计模式,在写代码的过程中,应该写尽量简单的代码来体现设计模式,学习设计模式,更多的是学习他的思想,然后运用到我们的实际开发中,让我们写出更优雅、高效的代码。