在论坛中有好几位同学都比较了Iterator和visitor模式,我也小小总结一下:
Iterator和visitor模式都是对对象聚集进行访问,并对访问的元素进行操作,
它们都是把访问的职责从集合\元素类中分离出来。
但Iterator在遍历集合、树形结构时,往往只是遍历元素,而对元素的
操作通常在其职责之外,并且在一个遍历过程外在的对元素操作通常是单一的
至少不会是每个元素一种不同的操作(否则需要大量的if...else判断),而
visitor模式则通常是遍历的同时对元素进行操作,而这种操作在一次遍历过程中
可以对不同元素进行专门的定制。
所以Iterator和visitor的使用情形是显然的:
仅仅对元素进行遍历,遍历过程不需要对每一种元素的操作特别的定制时使用Iterator,
而如果需要对每个元素进行特别的定制时,使用visitor模式。
visitor模式通常耦合性要比Iterator,集合类、元素需要知道visitor的存在,并实现
accept方法,visitor通常需要直接暴露元素类的数据成员,这破坏面向对象的封装性。
visitor模式最常出现的场合是composite模式出现的时候,二者经常形影不离。
Iterator通常是想让访问独立于特定的集合类,提供一个统一的访问接口。
Iterator和visitor模式都是对对象聚集进行访问,并对访问的元素进行操作,
它们都是把访问的职责从集合\元素类中分离出来。
但Iterator在遍历集合、树形结构时,往往只是遍历元素,而对元素的
操作通常在其职责之外,并且在一个遍历过程外在的对元素操作通常是单一的
至少不会是每个元素一种不同的操作(否则需要大量的if...else判断),而
visitor模式则通常是遍历的同时对元素进行操作,而这种操作在一次遍历过程中
可以对不同元素进行专门的定制。
所以Iterator和visitor的使用情形是显然的:
仅仅对元素进行遍历,遍历过程不需要对每一种元素的操作特别的定制时使用Iterator,
而如果需要对每个元素进行特别的定制时,使用visitor模式。
visitor模式通常耦合性要比Iterator,集合类、元素需要知道visitor的存在,并实现
accept方法,visitor通常需要直接暴露元素类的数据成员,这破坏面向对象的封装性。
visitor模式最常出现的场合是composite模式出现的时候,二者经常形影不离。
Iterator通常是想让访问独立于特定的集合类,提供一个统一的访问接口。