2.6 组合模式(composite)
- 将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
- 例如 办了一张永辉超市充值卡 它可以在任何门店进行消费 组合抽象类-leaf-composite
//组合抽象类
function EquipmentComposition(name) {
this.equipments = []
this.name = name
}
EquipmentComposition.prototype.add = function (equipment) {
this.equipments.push(equipment)
}
EquipmentComposition.prototype.getPrice = function () {
return this.equipments
.map(function (equipment) {
return equipment.getPrice()
})
.reduce(function (a, b) {
return a + b
})
}
// 设备
function Equipment() {}
Equipment.prototype.getPrice = function () {
return this.price
}
// --leaf
//软盘
function FloppyDisk() {
this.name = 'Floppy Disk'
this.price = 70
}
FloppyDisk.prototype = Object.create(Equipment.prototype)
//硬盘
function HardDrive() {
this.name = 'Hard Drive'
this.price = 250
}
HardDrive.prototype = Object.create(Equipment.prototype)
//内存
function Memory() {
this.name = '8gb memory'
this.price = 280
}
Memory.prototype = Object.create(Equipment.prototype)
module.exports = [EquipmentComposition, FloppyDisk, HardDrive, Memory]
const expect = require('chai').expect
const [EquipmentComposition, FloppyDisk, HardDrive, Memory] = require('../src/structural/composite/composite.js')
describe('组合模式 测试', () => {
it('机箱添加硬件 获取总价', () => {
var cabinet = new EquipmentComposition('cabinet')
cabinet.add(new FloppyDisk())
cabinet.add(new HardDrive())
cabinet.add(new Memory())
expect(cabinet.getPrice()).to.equal(600)
})
})
es6 实现
//组合抽象类
class Equipment {
getPrice() {
return this.price || 0
}
getName() {
return this.name
}
setName(name) {
this.name = name
}
}
// composite
class Composite extends Equipment {
constructor() {
super()
this.equipments = []
}
add(equipment) {
this.equipments.push(equipment)
}
getPrice() {
return this.equipments
.map(equipment => {
return equipment.getPrice()
})
.reduce((a, b) => {
return a + b
})
}
}
class Cabinet extends Composite {
constructor() {
super()
this.setName('cabinet')
}
}
// --leaf
class FloppyDisk extends Equipment {
constructor() {
super()
this.setName('Floppy Disk')
this.price = 70
}
}
class HardDrive extends Equipment {
constructor() {
super()
this.setName('Hard Drive')
this.price = 250
}
}
class Memory extends Equipment {
constructor() {
super()
this.setName('Memory')
this.price = 280
}
}
export { Cabinet, FloppyDisk, HardDrive, Memory }
const expect = require('chai').expect
import { Cabinet, FloppyDisk, HardDrive, Memory } from '../src/structural/composite/composite_es6'
describe('组合模式 es6测试', () => {
it('设备添加硬件 获取总价', () => {
var cabinet = new Cabinet('cabinet')
cabinet.add(new FloppyDisk())
cabinet.add(new HardDrive())
cabinet.add(new Memory())
expect(cabinet.getPrice()).to.equal(600)
})
})