二者最大的区别在于聚集中的元素是否异构,对于访问者模式,其存在最大的理由就是分离异构元素上的不同操作。迭代器模式用于按一定顺序访问聚集中的元素而不用暴露聚集的内部表示;而访问者模式是用来操作聚集上的元素,可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式在遍历聚集元素时也可采用迭代器实现。
意图:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
elements.Accept(visitor)
v.Visit(this)
中介看房的例子
中介(ObjectStructure):拥有大量房源信息 elements;
房源(IElement):分为城中村,商品房,别墅等。房源类型相对固定,但相互异构,拥有不同的属性和方法;
购房者(IVisitor):毕业生,白领,土豪等。购房者类型不固定,随时可能增加。每一种购房者针对每一种房源都有不同的关注点,同时购房者随着时间推移对于同一种房源的评价也会发生变化(如购房政策变化时);
意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
private sealed class
实现JS ES6 iterator - 外部迭代器,内禀迭代器
var obj = {}
obj[Symbol.iterator] = function() {
let index = 1;
return {
next() {
return {done: index>100, value: index++}
}
}
}
for(var i of obj) {
console.log(i);
}