iOS设计模式 - 访问者

原理图

说明

表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。

1.Visitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
2.ConcreteVisitor.具体访问者角色,实现Visitor声明的接口。
3.Element 定义一个接受访问操作(accept()),它以一个访问者(Visitor)作为参数。
4.ConcreteElement 具体元素,实现了抽象元素(Element)所定义的接受操作接口。
5.ObjectStructure 结构对象角色,这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。

源码

https://github.com/YouXianMing/iOS-Design-Patterns

//
// ElementProtocol.h
// VisitorPattern
//
// Created by YouXianMing on 15/10/27.
// Copyright © 2015年 ZiPeiYi. All rights reserved.
// #import <Foundation/Foundation.h>
@protocol VisitorProtocol; @protocol ElementProtocol <NSObject> /**
* 接收访问者
*
* @param visitor 访问者对象
*/
- (void)accept:(id <VisitorProtocol>)visitor; /**
* 元素公共的操作
*/
- (void)operation; @end
//
// VisitorProtocol.h
// VisitorPattern
//
// Created by YouXianMing on 15/10/27.
// Copyright © 2015年 ZiPeiYi. All rights reserved.
// #import <Foundation/Foundation.h>
#import "ElementProtocol.h" @protocol VisitorProtocol <NSObject> - (void)visitElement:(id <ElementProtocol>)element; @end
//
// ElementCollection.h
// VisitorPattern
//
// Created by YouXianMing on 15/10/27.
// Copyright © 2015年 ZiPeiYi. All rights reserved.
// #import <Foundation/Foundation.h>
@protocol ElementProtocol; @interface ElementCollection : NSObject /**
* 添加元素
*
* @param element 元素
* @param key 元素的键值
*/
- (void)addElement:(id <ElementProtocol>)element withKey:(NSString *)key; /**
* 获取所有元素的键值
*
* @return 所有元素的键值
*/
- (NSArray *)allKeys; /**
* 根据元素键值获取元素
*
* @param key 元素的键值
*
* @return 元素
*/
- (id <ElementProtocol>)elementWithKey:(NSString *)key; @end
//
// ElementCollection.m
// VisitorPattern
//
// Created by YouXianMing on 15/10/27.
// Copyright © 2015年 ZiPeiYi. All rights reserved.
// #import "ElementCollection.h"
#import "ElementProtocol.h" @interface ElementCollection () @property (nonatomic, strong) NSMutableDictionary *elementsDictionary; @end @implementation ElementCollection - (instancetype)init { self = [super init]; if (self) { self.elementsDictionary = [NSMutableDictionary dictionary];
} return self;
} - (void)addElement:(id <ElementProtocol>)element withKey:(NSString *)key { NSParameterAssert(element);
NSParameterAssert(key); [self.elementsDictionary setObject:element forKey:key];
} - (NSArray *)allKeys { return self.elementsDictionary.allKeys;
} - (id <ElementProtocol>)elementWithKey:(NSString *)key { NSParameterAssert(key); return [self.elementsDictionary objectForKey:key];
} @end

细节

最新文章

  1. MySql 存储过程、触发器和权限问题
  2. winServer2003除默认端口外的其他端口只能本地访问,关闭防火墙即可
  3. 高性能图文混排框架,构架顺滑的iOS应用-b
  4. 2D几何
  5. 转载爱哥自定义View系列--文字详解
  6. 深入了解shell
  7. php不同形式的实现a-z的26个字母的输出
  8. 使用phpQuery实现批量文件处理
  9. Asp.Net请求响应过程
  10. wpf 数据绑定的4种形式
  11. 在windows上安装VTK
  12. mysql之 sysbench1.0.3 安装与系统压力测试
  13. Qt应用程序单实例化
  14. ElasticSearch—分页查询
  15. JSP标准标签库JSTL
  16. 解决ImageCropperComponent发布报错
  17. BZOJ1996 [Hnoi2010] 合唱队
  18. 第九次,mp3
  19. CQOI2018 游记 再见OI,既是反思,也是祝福
  20. Linux 踩坑记录

热门文章

  1. WPF开发的彩票程序(练手好例子)
  2. MySQL数据库25条规范解读
  3. ubuntu16.04安装cuda,无法定位软件包问题
  4. 10.Set 和 Map 数据结构
  5. win10 uwp 让焦点在点击在页面空白处时回到textbox中
  6. 基于asp.net mvc的近乎产品开发培训课程(第三讲)
  7. IDEA相关设置
  8. 【转】Java 异步处理简单实践
  9. Eclipse中新建Java工程的三个JRE选项区别
  10. vue setTimeout--延迟操作