javascript的设计模式实现07之Observer

Observer模式参考图片:


代码:

var Iterator = function() {};
Iterator.prototype.first = function(){};
Iterator.prototype.next = function(){};
Iterator.prototype.isDone = function(){};
Iterator.prototype.currentItem = function(){};

var ArrayIterator = function(o) {
	var items = o;
	var curIdx = -1;
	this.first = function() {
		if (items == null || items.length < 1)
			return null;
		curIdx = 0;
		return items[0];
	};
	this.next = function() {
		if (items == null || items.length < 1)
			return null;
		if (this.isDone())
			return items[items.length - 1];
		else
			return items[curIdx++];
	};
	this.isDone = function() {
		if (items == null || items.length < 1 || items[curIdx] == null)
			return true;
		else
			return false;
	};
	this.currentItem = function() {
		if (this.isDone())
			return null;
		else
			return items[curIdx];
	};
	this.currentIdx = function() {
		return curIdx;
	};
};
ArrayIterator.prototype = new Iterator;
ArrayIterator.prototype.constructor = ArrayIterator;

var Map = function() {};
Map.prototype.createIterator = function() {};

var MyMap = function() {
	this.datas = new Array;
	this.createIterator = function() {
		return new ArrayIterator(this.datas);
	};
};
MyMap.prototype = new Map;
MyMap.prototype.constructor = MyMap;
MyMap.prototype.find = function(key) {
	var itor = this.createIterator();
	itor.first();
	var item;
	while(!itor.isDone()) {
		item = itor.currentItem();
		if (key.localeCompare(item.key) == 0)
			return item.value;
		itor.next();
	};
	return null;
};
MyMap.prototype.update = function(key, value) {
	var itor = this.createIterator();
	itor.first();
	var item;
	while(!itor.isDone()) {
		item = itor.currentItem();
		if (key.localeCompare(item.key) == 0) {
			this.datas.splice(itor.currentIdx(), 1, {key:key, value:value});			
			return true;
		}
		itor.next();
	};
	return false;
};
MyMap.prototype.add = function(key, value, ifUpdate) {
	var item = this.find(key);
	if (item != null && ifUpdate == true)
		return this.update(key, value);
	if (item == null) {
		this.datas.push({key:key, value:value});
		return true;
	}
	return false;
};
MyMap.prototype.del = function(key) {
	var itor = this.createIterator();
	itor.first();
	var item;
	while(!itor.isDone()) {
		item = itor.currentItem();
		if (key.localeCompare(item.key) == 0) {
			this.datas.splice(itor.currentIdx(), 1);			
			return item;
		}
		itor.next();
	};
	return null;
};

var Observer = function() {};
Observer.prototype.update = function() {};
Observer.prototype.setLabel = function(o) {
	this.label = o;
};
Observer.prototype.getLabel = function() {
	return this.label;
};
Observer.prototype.setSubject = function(o) {
	this.subject = o;
};
Observer.prototype.getSubject = function() {
	return this.subject;
};

var Subject = function() {};
Subject.prototype.attach = function(s, o) {
	if (this.observers == null)
		this.observers = new MyMap;
	return this.observers.add(s, o);
};
Subject.prototype.detach = function(s) {
	if (this.observers == null)
		this.observers = new MyMap;
	return this.observers.del(s);
};
Subject.prototype.notify = function() {
	if (this.observers == null)
		return;
	var itor = this.observers.createIterator();
	itor.first();
	var observer;
	while (!itor.isDone()) {
		observer = itor.currentItem();
		observer.value.update();
		itor.next();
	};
};

var ConcreteSubject = function() {
	var data1 = 1;
	var data2 = 2;
	this.getData = function() {
		console.log("data1:" + data1 + ",data2:" + data2);
	};
	this.setData = function(o1, o2) {
		data1 = o1;
		data2 = o2;
	};
};
ConcreteSubject.prototype = new Subject;
ConcreteSubject.prototype.constructor = ConcreteSubject;

var ConcreteObserver = function(s, o) {
	this.setLabel(s);
	this.setSubject(o);
	this.update = function() {
		console.log(this.getLabel() + "---");
		if (this.subject != null)
			subject.getData();
	};
};
ConcreteObserver.prototype = new Observer;
ConcreteObserver.prototype.constructor = ConcreteObserver;

var subject = new ConcreteSubject();
var obs1 = new ConcreteObserver("1", subject);
var obs2 = new ConcreteObserver("2", subject);
var obs3 = new ConcreteObserver("3", subject);
var obs4 = new ConcreteObserver("4", subject);
subject.attach(obs1.getLabel(), obs1);
subject.attach(obs2.getLabel(), obs2);
subject.attach(obs3.getLabel(), obs3);
subject.attach(obs4.getLabel(), obs4);
subject.notify();
subject.setData(11, 22);
subject.detach(obs2.getLabel());
subject.notify();
subject.setData(11111, 22222);
subject.notify();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值