# 设计模式——装饰者模式

装饰是生活中很常见的行为,我们给房子搞装修,自己装扮自己的卧室等这些都能够算作装饰,那么我们为什么要搞装饰?还不是为了让房子变得更加美观,漂亮,更有特色。同样,在开发中装饰者模式也是为了给对象增加新的特性,或者说增加新的功能。

# 装饰者模式定义:

在不创建新对象的情况下,给对象添加新的特性。就类似于在不破坏房子的情况下,给房子进行装修,我们不可能把买来的房子拆了再重新建一个再装修,同样装饰者模式是在不创建新对象的情况下,给对象增加新的特性。下面看具体代码:

 class Car{
    constructor(name,price){
      this.name = name,
      this.price = price
    }
    getCar(){
      console.log('买了这辆车')
    }
  }

  let xiaoming = new Car('宝马','100万');
  xiaoming.getCar();
  let xiaohong = new Car('丰田','50万');
  xiaohong.getCar();
  let xiaogang = new Car('大众','30万');
  xiaogang.getCar();

如上面代码所示:定义了汽车类,小明花了100万买了宝马车,小红花了50万买了丰田车,小刚花了30万买了大众车。但是这时候经销商突然进行促销了,说买宝马的可以再送两个轮胎,买丰田的可以再送购物卡,买大众的可以再送加油卡。那么这时候对于小明,小刚,小红它们来说应该怎么办了?他们应该也有这些送的东西(注意每种车送的东西不一样),我们不可能再将这些特性再添加到Car类上面去,然后再创建小明等实例去买车。也就是说我们需要再不创建新的实例的情况下,给对象添加特性,这恰好是装饰着模式的定义, 下面看具体的代码实现:

  class Car{
    constructor(name,price){
      this.name = name,
        this.price = price
    }
    getCar(){
      console.log('买了这辆车')
    }
  }

  let xiaoming = new Car('宝马','100万');
  xiaoming.getCar();
  let xiaohong = new Car('丰田','50万');
  xiaohong.getCar();
  let xiaogang = new Car('大众','30万');
  xiaogang.getCar();


  //装饰过程
  function decoratorBaoma(){
    this.wheel = '宝马车送轮胎'
  }
  decoratorBaoma.call(xiaoming)

  function decoratorFengtian(){
    this.shoppingcard = '丰田车送购物卡'
  }
  decoratorFengtian.call(xiaohong)

  function decoratordazhong(){
    this.oil = '大众车送加油卡'
  }
  decoratordazhong.call(xiaogang)
  console.log(xiaoming)
  console.log(xiaohong)

如面代码所示:我们在没有创建新对象的情况下,定义了三个装饰函数,通过给宝马车用户添加wheel属性送轮胎,给丰田车用户添加shoppingcard属性送购物卡,给大众车用户添加oil属性送加油卡。然后执行这几个函数,修改相对应的this指向即可。这样的话就实现了我们想要的功能。这就是装饰者模式。

# 装饰者模式总结

装饰者模式就是在不创建新对象的情况下,给对象添加新的特性。