装饰者模式(structural 4)

229 阅读1分钟

2.2 装饰者模式(decorator)

  • 动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用 Decorator 模式相比用生成子类方式达到功能的扩充显得更为灵活。
  • 设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。
// 意大利面价格
function Pasta() {
	this.price = 0
}
Pasta.prototype.getPrice = function () {
	return this.price
}
// 意面
function Penne() {
	this.price = 8
}
Penne.prototype = Object.create(Pasta.prototype)

//调味汁
function SauceDecorator(pasta) {
	this.pasta = pasta
}
SauceDecorator.prototype.getPrice = function () {
	return this.pasta.getPrice() + 5
}

//奶酪
function CheeseDecorator(pasta) {
	this.pasta = pasta
}
CheeseDecorator.prototype.getPrice = function () {
	return this.pasta.getPrice() + 3
}

module.exports = [Penne, SauceDecorator, CheeseDecorator]
const expect = require('chai').expect
const [Penne, SauceDecorator, CheeseDecorator] = require('../src/structural/decorator/decorator')

describe('装饰模式测试', () => {
	it('装饰', () => {
		//每次new 添加新的装饰
		var penne = new Penne()
		var penneWithSauce = new SauceDecorator(penne)
		var panneWithSauceAndCheese = new CheeseDecorator(penneWithSauce)

		expect(penne.getPrice()).to.equal(8)
		expect(penneWithSauce.getPrice()).to.equal(13)
		expect(panneWithSauceAndCheese.getPrice()).to.equal(16)
	})
})

es6 实现

class Pasta {
	constructor() {
		this.price = 0
	}
	getPrice() {
		return this.price
	}
}

class Penne extends Pasta {
	constructor() {
		super()
		this.price = 8
	}
}

class PastaDecorator extends Pasta {
	constructor(pasta) {
		super()
		this.pasta = pasta
	}
	getPrice() {
		return this.pasta.getPrice()
	}
}

class SauceDecorator extends PastaDecorator {
	constructor(pasta) {
		super(pasta)
	}
	getPrice() {
		return super.getPrice() + 5
	}
}

class CheeseDecorator extends PastaDecorator {
	constructor(pasta) {
		super(pasta)
	}
	getPrice() {
		return super.getPrice() + 3
	}
}

export { Penne, SauceDecorator, CheeseDecorator }
const expect = require('chai').expect
import { Penne, SauceDecorator, CheeseDecorator } from '../src/structural/decorator/decorator_es6'

describe('装饰模式 es6测试', () => {
	it('装饰', () => {
		//每次new 添加新的装饰
		var penne = new Penne()
		var penneWithSauce = new SauceDecorator(penne)
		var panneWithSauceAndCheese = new CheeseDecorator(penneWithSauce)

		expect(penne.getPrice()).to.equal(8)
		expect(penneWithSauce.getPrice()).to.equal(13)
		expect(panneWithSauceAndCheese.getPrice()).to.equal(16)
	})
})