装饰器模式
例子:有些人早餐可能会吃手抓饼,手抓饼里面可以加鸡蛋,也可以加香肠,但是不管怎么加,都还是一个手抓饼
什么是装饰器模式
在不改变原有对象的基础之上,将功能附加到对象上
核心就是功能扩展
装饰器模式的角色组成
- 抽象组件(Component)
- 可以是一个接口也可以是一个抽象类,负责规定对象的行为;
- 具体组件(ConcreteComponent)
- 实现/继承Component的一个对象
- 抽象装饰器(Decorator)
- 内部要有一个属性指向Component抽象组件
- 具体装饰器(ConcreteDecorator)
- 负责实现抽象装饰器
-
装饰器模式通用写法示例
-
1、创建一个抽象组件Component来规定被装饰对象的行为
-
public abstract class Component { public abstract void execute(); }
-
-
2、创建具体组件ConcreteComponent
-
public class ConcreteComponent extends Component{ @Override public void execute() { System.out.println("处理逻辑"); } }
-
-
3、创建一个抽象装饰器Decorator
-
public abstract class Decorator extends Component { // 抽象组件 public Component component; // 通过构造器给属性赋值 public Decorator(Component component){ this.component = component; } // 装饰器的规范 public abstract void execute(); }
-
-
4、创建具体装饰器ConcreteDecorator
-
public class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } // public void before(){ System.out.println("ConcreteDecorator前置操作..."); } public void after(){ System.out.println("ConcreteDecorator后置操作...."); } // 负责装饰抽象组件 @Override public void execute() { before(); component.execute(); after(); } }
-
-
-
5、测试
-
public class Test { public static void main(String[] args) { // 创建需要被装饰的组件 Component component = new ConcreteComponent(); // 给对象透明的添加功能并调用 Decorator decorator = new ConcreteDecorator(component); decorator.execute(); } }
-
-
6、结果
装饰器模式优缺点
- 优点
- 不改变原有对象的情况下给一个对象扩展功能
- 可以使用不同装饰器类的排列组合实现不同效果
- 缺点
- 会出现更多的代码,添加程序复杂性
- 多层装饰时会更复杂
- 优点
- 不改变原有对象的情况下给一个对象扩展功能
- 可以使用不同装饰器类的排列组合实现不同效果
- 缺点
- 会出现更多的代码,添加程序复杂性
- 多层装饰时会更复杂