设计模式之迭代器与访问者模式解析
立即解锁
发布时间: 2025-08-13 03:03:34 阅读量: 2 订阅数: 3 


Objective-C设计模式:提升iOS开发技能
### 设计模式之迭代器与访问者模式解析
#### 迭代器模式
迭代器模式的代码片段展示了`Mark`协议和`Stroke`类的变化。以下是相关代码:
```objc
// Mark.h
@protocol Mark <NSObject>
@property (nonatomic, retain) UIColor *color;
@property (nonatomic, assign) CGFloat size;
@property (nonatomic, assign) CGPoint location;
@property (nonatomic, readonly) NSUInteger count;
@property (nonatomic, readonly) id <Mark> lastChild;
- (void) addMark:(id <Mark>) mark;
- (void) removeMark:(id <Mark>) mark;
- (id <Mark>) childMarkAtIndex:(NSUInteger) index;
- (NSEnumerator *) enumerator;
// for internal iterator implementation
- (void) enumerateMarksUsingBlock:(void (^)(id <Mark> item, BOOL *stop)) block;
@end
```
`Stroke`类中`enumerateMarksUsingBlock:`方法的实现如下:
```objc
// Stroke.m
- (void) enumerateMarksUsingBlock:(void (^)(id <Mark> item, BOOL *stop)) block
{
BOOL stop = NO;
NSEnumerator *enumerator = [self enumerator];
for (id <Mark> mark in enumerator)
{
block (mark, &stop);
if (stop)
break;
}
}
```
迭代器模式与访问者模式有一定相似性,特别是当将遍历算法融入访问者模式,或者让内部迭代器在遍历聚合时对元素执行操作。此外,它还与组合模式、工厂方法模式和备忘录模式相关:
- 组合模式常依赖迭代器遍历其递归结构。
- 多态迭代器依赖工厂方法实例化合适的迭代器具体子类。
- 有时,备忘录会与迭代器模式结合使用,迭代器可使用备忘录捕获迭代状态,将其存储在内部,后续再恢复内部状态。
#### 访问者模式
##### 概念引入
想象家里出现 plumbing 问题,但你不知如何修理。即便你是房子主人,也不意味着了解房子的所有细节。此时,最有效的解决办法是请专家尽快修复。在软件设计中,若架构师为扩展类的功能塞入过多方法,类会变得极其复杂。更好的方法是有一个外部类,能在不大量更改原始代码的情况下扩展其功能,这就是访问者模式的核心思想。
##### 模式定义
访问者模式涉及两个关键角色:访问者和被访问的元素。元素可以是任何对象,通常是部分 - 整体结构中的节点。访问者了解复杂结构中的每个元素,可访问元素节点,并根据元素的属性、特性或操作执行相应操作。
以下是访问者模式的静态关系:
```mermaid
classDiagram
class Visitor {
+visitMark(Mark)
+visitDot(Dot)
+visitVertex(Vertex)
+visitStroke(Stroke)
}
class ConcreteVisitor1 {
+visitMark(Mark)
+visitDot(Dot)
+visitVertex(Vertex)
+visitStroke(Stroke)
}
class ConcreteVisitor2 {
+visitMark(Mark)
+visitDot(Dot)
+visitVertex(Vertex)
+visitStroke(Stroke)
}
class Element {
+acceptVisitor(Visitor)
}
class Dot {
+acceptVisitor(Visitor)
}
class Vertex {
+acceptVisitor(Visitor)
}
class Stroke {
+acceptVisitor(Visitor)
}
Visitor <|.. ConcreteVisitor1
Visitor <|.. ConcreteVisitor2
Element
```
0
0
复制全文
相关推荐









