桥接模式(structural 2)

250 阅读1分钟

2.5 桥接模式(bridge)

  • 通过组合的方式建立两个类之间的联系,而不是继承。将抽 象和实现解耦,让它们可以独立变化。
// 将基础什么材料生产的进行说明
function EpsonPrinter(ink) {
	this.ink = ink()
}
EpsonPrinter.prototype.print = function () {
	return 'Printer: Epson, Ink: ' + this.ink
}

function HPprinter(ink) {
	this.ink = ink()
}
HPprinter.prototype.print = function () {
	return 'Printer: HP, Ink: ' + this.ink
}
// 基于丙烯酸
function acrylicInk() {
	return 'acrylic-based'
}
//基于活性炭
function alcoholInk() {
	return 'alcohol-based'
}

module.exports = [EpsonPrinter, HPprinter, acrylicInk, alcoholInk]
const expect = require('chai').expect
const [EpsonPrinter, HPprinter, acrylicInk, alcoholInk] = require('../src/structural/bridge/bridge');


describe('桥接模式测试', () => {
	it('爱普生打印机', () => {
		const printer = new EpsonPrinter(alcoholInk)
		const result = printer.print()

		expect(result).to.equal('Printer: Epson, Ink: alcohol-based')
	})
	it('惠普打印机', () => {
		const printer = new HPprinter(acrylicInk)
		const result = printer.print()

		expect(result).to.equal('Printer: HP, Ink: acrylic-based')
	})
})

es6 实现

class Printer {
	constructor(ink) {
		this.ink = ink
	}
}

class EpsonPrinter extends Printer {
	constructor(ink) {
		super(ink)
	}
	print() {
		return 'Printer: Epson, Ink: ' + this.ink.get()
	}
}

class HPprinter extends Printer {
	constructor(ink) {
		super(ink)
	}
	print() {
		return 'Printer: HP, Ink: ' + this.ink.get()
	}
}

class Ink {
	constructor(type) {
		this.type = type
	}
	get() {
		return this.type
	}
}

class AcrylicInk extends Ink {
	constructor() {
		super('acrylic-based')
	}
}
class AlcoholInk extends Ink {
	constructor() {
		super('alcohol-based')
	}
}

export { EpsonPrinter, HPprinter, AcrylicInk, AlcoholInk }
const expect = require('chai').expect
import {
  EpsonPrinter,
  HPprinter,
  AcrylicInk,
  AlcoholInk
} from '../src/structural/bridge/bridge_es6';

describe('桥接模式 es6测试', () => {
	it('爱普生打印机', () => {
		const printer = new EpsonPrinter(new AlcoholInk())
		const result = printer.print()

		expect(result).to.equal('Printer: Epson, Ink: alcohol-based')
	})
	it('惠普打印机', () => {
		const printer = new HPprinter(new AcrylicInk())
		const result = printer.print()

		expect(result).to.equal('Printer: HP, Ink: acrylic-based')
	})
})