相较于建造者模式,建造者模式要求建造的过程必须是稳定的,装饰模式的建造过程不稳定的。

概念:装饰模式是利用SetComponent来对对象进行包装的,每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象之关心自己的功能,不需要关心如何添加到对象链中
核心:为已有功能动态地添加更多功能的一种方式

装饰模式结构图

image.png
如果只有一个ConcreteComponent类而没有抽象的Component类,可以让Decorator直接继承ConcreteComponent。
如果只有一个ConcreteDecorator类,没有Decorator类,可以把ConcreteComponent和Decorator合成一个类

场景:一个人搭配不同衣服出门

image.png
java代码:

  1. public class DecoratorTest {
  2. public static void main(String[] args) {
  3. Person person = new Person("涛涛");
  4. TShirts tShirts = new TShirts();
  5. BigTrouser bigTrouser = new BigTrouser();
  6. //装饰步骤
  7. tShirts.Decorate(person);
  8. bigTrouser.Decorate(tShirts);
  9. bigTrouser.show();
  10. }
  11. }
  12. public class Person {
  13. public Person(){
  14. }
  15. String name;
  16. public Person(String name){
  17. this.name = name;
  18. }
  19. public void show(){
  20. System.out.println("装扮的" + name);
  21. }
  22. }
  23. //Decorator装饰器
  24. public class Finery extends Person{
  25. protected Person component;
  26. public void Decorate(Person person){
  27. component = person;
  28. }
  29. public void show(){
  30. if (component != null){
  31. component.show();
  32. }
  33. }
  34. }
  35. public class BigTrouser extends Finery{
  36. @Override
  37. public void show() {
  38. System.out.print("垮裤 ");
  39. super.show();
  40. }
  41. }
  42. public class TShirts extends Finery {
  43. @Override
  44. public void show() {
  45. System.out.print("穿T恤 ");
  46. super.show();
  47. }
  48. }