职责:动态的为一个对象增加新的功能
    装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀

    优点:

    1. 扩展对象功能,比继承灵活,不会导致类个数急剧增加
    2. 可以对一个对象进行多次装饰,创建出不同行为的组合,

      飞行汽车
      增加浮沉箱,水上汽车
      增加人工智能,自动驾驶
      增加翅膀
      得到功能更加大的对象
    3. 具体构建类和具体装饰类可以独立变化,用户可以根据需
      要自己增加新的具体构件子类和具体装饰子类
      缺点
    4. 产生很多小对象。大量小对象占据内存,一定程序上影响
      性能
    5. 装饰模式易于出错,调试排查比较麻烦

    适用于继承自同一接口和同一装饰器类下,类中的一个对象可以调用其他多个不同类的方法
    代码

    1. package com.sxt.io;
    2. /**
    3. * 模拟咖啡
    4. * 1、抽象组件:需要装饰的抽象对象(接口或抽象父类)
    5. * 2、具体组件:需要装饰的对象
    6. * 3、抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法
    7. * 4、具体装饰类:被装饰的对象
    8. * @author TW
    9. *
    10. */
    11. public class DecorateTest02 {
    12. public static void main(String[] args) {
    13. Drink coffee =new Coffee();
    14. Drink suger =new Suger(coffee); //装饰
    15. System.out.println(suger.info()+"-->"+suger.cost());
    16. Drink milk =new Milk(coffee);//装饰
    17. System.out.println(milk.info()+"-->"+milk.cost());
    18. milk =new Milk(suger);//装饰
    19. System.out.println(milk.info()+"-->"+milk.cost());
    20. }
    21. }
    22. //抽象组件
    23. interface Drink{
    24. double cost(); //费用
    25. String info(); //说明
    26. }
    27. //具体组件
    28. class Coffee implements Drink{
    29. private String name ="原味咖啡";
    30. @Override
    31. public double cost() {
    32. return 10;
    33. }
    34. @Override
    35. public String info() {
    36. return name;
    37. }
    38. }
    39. //抽象装饰类
    40. abstract class Decorate implements Drink{
    41. //对抽象组件的引用
    42. private Drink drink;
    43. public Decorate(Drink drink) {
    44. this.drink =drink;
    45. }
    46. @Override
    47. public double cost() {
    48. return this.drink.cost();
    49. }
    50. @Override
    51. public String info() {
    52. return this.drink.info();
    53. }
    54. }
    55. //具体装饰类
    56. class Milk extends Decorate{
    57. public Milk(Drink drink) {
    58. super(drink);
    59. }
    60. @Override
    61. public double cost() {
    62. return super.cost()*4;
    63. }
    64. @Override
    65. public String info() {
    66. return super.info()+"加入了牛奶";
    67. }
    68. }
    69. class Suger extends Decorate{
    70. public Suger(Drink drink) {
    71. super(drink);
    72. }
    73. @Override
    74. public double cost() {
    75. return super.cost()*2;
    76. }
    77. @Override
    78. public String info() {
    79. return super.info()+"加入了蔗糖";
    80. }
    81. }