建造者模式(creational 4)

217 阅读1分钟

1.4 建造者模式(builder)

  • 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
//对象
function Request() {
  this.url = '';
  this.method = '';
  this.payload = {};
}
//每个不同的表示 return this 支持链式调用
function RequestBuilder() {

  this.request = new Request();

  this.forUrl = function(url) {
    this.request.url = url;
    return this;
  };

  this.useMethod = function(method) {
    this.request.method = method;
    return this;
  };

  this.payload = function(payload) {
    this.request.payload = payload;
    return this;
  };

  this.build = function() {
    return this.request;
  };

}

module.exports = RequestBuilder;

const expect = require('chai').expect
const RequestBuilder = require('../src/creational/builder/builder');

describe('建造者模式测试', () => {
	it('构建行为分离 method', () => {
		var requestBuilder = new RequestBuilder()
		var request = requestBuilder.forUrl('http://something/users').useMethod('GET').payload(null).build()

		expect(request.method).to.equal('GET')
	})
})

es6 实现

class Request {
  constructor() {
    this.url = '';
    this.method = '';
    this.payload = {};
  }
}

class RequestBuilder {
  constructor() {
    this.request = new Request();
  }

  forUrl(url) {
    this.request.url = url;
    return this;
  }

  useMethod(method) {
    this.request.method = method;
    return this;
  }

  payload(payload) {
    this.request.payload = payload;
    return this;
  }

  build() {
    return this.request;
  }

}

export default RequestBuilder;
const expect = require('chai').expect
import RequestBuilder from '../src/creational/builder/builder_es6';

describe('建造者模式 es6测试', () => {
	it('构建行为分离 es6', () => {
		const requestBuilder = new RequestBuilder()
		const url = 'http://something/users'
		const method = 'GET'
		const request = requestBuilder.forUrl(url).useMethod(method).payload(null).build()

		expect(request.method).to.equal(method)
		expect(request.payload).to.be.null
		expect(request.url).to.equal(url)
	})
})