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();