# 结构型-装饰器模式

# 定义

当我们想要基于老的类需要在原有的功能上加强,但是又不能违反开闭原则时,我们可以使用装饰器模式,将原有老的类包装在新的类内部,给与一些装饰,然后调用新的类,达到加强功能而不改动老的类的目的。

# 优点

  • 符合开闭原则
  • 组合形式,低耦合
  • 动态拓展

# 缺点

  • 如果装饰层数过多,会过于复杂,不利于维护

# 实现

    interface Car {
        void run();
    }

    interface BalanceCarDecorator extends Car {

    }

    class BalanceCar implements Car {

        @Override
        public void run() {
            System.out.println("Driving");
        }
    }

    class Kart implements BalanceCarDecorator {
        private Car car;

        public Kart(Car car) {
            this.car = car;
            System.out.println("安装油门");
        }

        @Override
        public void run() {
            System.out.println("踩油门");
            car.run();
        }
    }
    
    BalanceCarDecorator car = new Kart(new BalanceCar());
    car.run();

原有的平衡车只能站着动,我们想要一辆卡丁车,可以坐着踩油门开,但是我们又不能将原有的车改成卡丁车,这个时候可以使用装饰器模式,将原有的平衡车装饰成卡丁车,在外面套个壳子,然后再调用平衡车的开动之前,可以改造成踩油门开动。

# Java应用

在Java IO包中有很多使用装饰器模式的类 image