策略模式(behavioral 9)

238 阅读1分钟

3.9 策略模式(strategy)

  • 一个类的行为或其算法可以在运行时更改。
    • 创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
    • 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
// 策略对象 discount对应不同的折扣算法
function ShoppingCart(discount) {
	this.discount = discount
	this.amount = 0
}
ShoppingCart.prototype.setAmount = function (amount) {
	this.amount = amount
}
ShoppingCart.prototype.checkout = function () {
	return this.discount(this.amount)
}
// 策略算法
function guestStrategy(amount) {
	return amount
}

function regularStrategy(amount) {
	return amount * 0.9
}

function premiumStrategy(amount) {
	return amount * 0.8
}

module.exports = [ShoppingCart, guestStrategy, regularStrategy, premiumStrategy]
const expect = require('chai').expect
const [ShoppingCart, guestStrategy, regularStrategy, premiumStrategy] = require('../src/behavioral/strategy/strategy.js')

describe('策略模式 测试', () => {
	it('客人购物折扣', () => {
		var guestCart = new ShoppingCart(guestStrategy)
		guestCart.setAmount(100)
		expect(guestCart.checkout()).to.equal(100)
	})
	it('常规折扣', () => {
		var guestCart = new ShoppingCart(regularStrategy)
		guestCart.setAmount(100)
		expect(guestCart.checkout()).to.equal(90)
	})
	it('赠品折扣', () => {
		var guestCart = new ShoppingCart(premiumStrategy)
		guestCart.setAmount(100)
		expect(guestCart.checkout()).to.equal(80)
	})
})

es6 实现

// 策略对象 discount对应不同的折扣算法
class ShoppingCart {
	constructor(discount) {
		this.discount = discount
		this.amount = 0
	}
	setAmount(amount) {
		this.amount = amount
	}
	checkout() {
		return this.discount(this.amount)
	}
}

// 策略算法

function guestStrategy(amount) {
	return amount
}

function regularStrategy(amount) {
	return amount * 0.9
}

function premiumStrategy(amount) {
	return amount * 0.8
}

export { ShoppingCart, guestStrategy, regularStrategy, premiumStrategy }
const expect = require('chai').expect
import { ShoppingCart, guestStrategy, regularStrategy, premiumStrategy } from '../src/behavioral/strategy/strategy_es6.js'

describe('策略模式 es6测试', () => {
	it('客人购物折扣', () => {
		var guestCart = new ShoppingCart(guestStrategy)
		guestCart.setAmount(100)
		expect(guestCart.checkout()).to.equal(100)
	})
	it('常规折扣', () => {
		var guestCart = new ShoppingCart(regularStrategy)
		guestCart.setAmount(100)
		expect(guestCart.checkout()).to.equal(90)
	})
	it('赠品折扣', () => {
		var guestCart = new ShoppingCart(premiumStrategy)
		guestCart.setAmount(100)
		expect(guestCart.checkout()).to.equal(80)
	})
})