Skip to content

Instantly share code, notes, and snippets.

@zD98
Created March 23, 2016 01:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zD98/92aea7ea324aafc200dc to your computer and use it in GitHub Desktop.
Save zD98/92aea7ea324aafc200dc to your computer and use it in GitHub Desktop.
设计模式-装饰器模式

##Decorator模式(*) ###总结 向基本对象添加(装饰)属性或方法, 而不是进行子类化

###例子 eg.1简单实现-对对象的属性扩展 function vehicle(vehicleType) { this.xxx = ...; } var truck = new vehicle('truck'); truck.setColor = function(color){} truck.setModel = function(modelName){}

eg.2多个Decorator 装饰对象
	function MacBook() {
		this.cost = function(){return 997;}
		this.screenSize = funciton(){return 11.6;}
	}   
	//Decorator 1
	function Memory(macbook){
		var v = macbook.cost();
		macbook.cost = function(){
			return v+75;
		}
	}
	//Decorator2
	function Engraving(macbook){
		var v = macbook.cost();
		macbook.cost = function(){
			return v+200;
		}
	}
	//Decorator3.4.5....
	var mb = new MacBook();
	Memory(mb);
	Engraving(mb);
	mb.cost();

eg.3接口与抽象Decorator
	为MacBook定义的接口
	var MacBook = new Interface(""Macbook",["addEngraving","addParallels","add4GBRam"...]);
	MacBook.prototype = {
		addEngraving:function(){},
		addOarallels:function(){},
		add4GBRam:function(){},
		...
	}

	var MacbookDecorator = function(macbook){
		this.macbook = macbook;
		//接口检验
	}
	
	MacbookDecorator.prototype = {
		addEngraving:function(){
			return this,macbook.addEngraving();
		}
		...
	}

	var CaseDecorator = function (macbook) {
		this.superclass.constructor(macbook);
	}
	extend(CaseDecorator, MacbookDecorator);

	CaseDecorator.prototype.addCase = function(){
		return this.macbook.addCase()+"";
	}

	var mb = new MacBookDecorator()
	mb = new CaseDecorator(mb);

###分析 装饰者可以动态修改对象 为对象创建装饰者比维护每个对象的单个子类要更好一些

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment