# 设计模式——装饰者模式
装饰是生活中很常见的行为,我们给房子搞装修,自己装扮自己的卧室等这些都能够算作装饰,那么我们为什么要搞装饰?还不是为了让房子变得更加美观,漂亮,更有特色。同样,在开发中装饰者模式也是为了给对象增加新的特性,或者说增加新的功能。
# 装饰者模式定义:
在不创建新对象的情况下,给对象添加新的特性。就类似于在不破坏房子的情况下,给房子进行装修,我们不可能把买来的房子拆了再重新建一个再装修,同样装饰者模式是在不创建新对象的情况下,给对象增加新的特性。下面看具体代码:
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
指向即可。这样的话就实现了我们想要的功能。这就是装饰者模式。
# 装饰者模式总结
装饰者模式就是在不创建新对象的情况下,给对象添加新的特性。