什么是装饰器模式?

装饰对象,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。

适用场景

在不改变现有组件结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。

代码实现

通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。
其次是使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。

示例:
画一个圆形,然后用颜色装饰,画一个红色的圆形。

  1. //画一个圆形,然后用颜色装饰,画一个红色的圆形。
  2. /**
  3. * 定义个接口 形状
  4. */
  5. interface Shape {
  6. void draw();
  7. }
  8. /**
  9. * 具体的形状 圆形
  10. */
  11. class Circular implements Shape {
  12. @Override
  13. public void draw() {
  14. System.out.println("圆形");
  15. }
  16. }
  17. /**
  18. * 抽象的装饰器
  19. * 使用组合方式实现
  20. */
  21. abstract class Decorator implements Shape {
  22. private Shape shape;
  23. public Decorator(Shape shape) {
  24. this.shape = shape;
  25. }
  26. @Override
  27. public void draw() {
  28. //装饰功能 增加颜色
  29. colour();
  30. shape.draw();
  31. }
  32. protected abstract void colour();
  33. }
  34. /**
  35. * 装饰红色
  36. */
  37. class RedDecorator extends Decorator {
  38. public RedDecorator(Shape shape) {
  39. super(shape);
  40. }
  41. @Override
  42. protected void colour() {
  43. System.out.print("用红色画");
  44. }
  45. }
  46. /**
  47. * 装饰品模式测试
  48. */
  49. public class DecoratorPattern {
  50. public static void main(String[] args) {
  51. //画个圆形
  52. Shape circular = new Circular();
  53. circular.draw();
  54. //装饰颜色
  55. Decorator redDecorator = new RedDecorator(circular);
  56. redDecorator.draw();
  57. //输出:
  58. //圆形
  59. //用红色画圆形
  60. }
  61. }