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

细节

iOS设计模式 - 访问者的更多相关文章

  1. iOS书摘之Objective-C编程之道 iOS设计模式解析

    来自<Objective-C编程之道iOS设计模式解析>一书的摘要总结 一.Prototype 原型模式 定义:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象.(<设 ...

  2. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  3. IOS设计模式之一(MVC模式,单例模式)

    iOS 设计模式-你可能已经听说过这个词,但是你真正理解它意味着什么吗?虽然大多数的开发者可能都会认为设计模式是非常重要的,然而关于设计模式这一主题的文章却不多,并且有时候我们开发者在写代码的时候也不 ...

  4. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  5. iOS设计模式之生成器

    iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得相同的构建过程能够创建不同的表示 (2): 生成器模式除了客户之外还包括一个Director(指导者) ...

  6. IOS设计模式之三:MVC模式

    IOS设计模式之三:MVC模式   模型-视图-控制器 这个模式其实应该叫做MCV,用控制器把model与view隔开才对,也就是model与view互相不知道对方的存在,没有任何瓜葛,他们就像一个团 ...

  7. iOS设计模式 - 享元

    iOS设计模式 - 享元 原理图 说明 享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件.通常物件中的部分 ...

  8. iOS设计模式 - 责任链

    iOS设计模式 - 责任链 原理图 说明 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链 ...

  9. iOS设计模式 - 模板

    iOS设计模式 - 模板 原理图 说明 定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤. 源码 https://github.c ...

随机推荐

  1. AAAI2019 | 基于区域分解集成的目标检测 论文解读

    Object Detection based on Region Decomposition and Assembly AAAI2019 | 基于区域分解集成的目标检测 论文解读 作者 | 文永亮 学 ...

  2. beego 遇到的一些问题

    1.安装 beego 出现的问题 今天在通过 go get -u github.com/astaxie/beego 安装 beego 应用时,出现下面问题: # cd .; git clone htt ...

  3. C#中给滚动条增加鼠标滚动轮控制事件

    当滚动条的父控件获得焦点时,可以使用鼠标的滚动轮来控制滚动条 public partial class Form1 : Form { public Form1() { InitializeCompon ...

  4. Java并发编程笔记之Unsafe类和LockSupport类源码分析

    一.Unsafe类的源码分析 JDK的rt.jar包中的Unsafe类提供了硬件级别的原子操作,Unsafe里面的方法都是native方法,通过使用JNI的方式来访问本地C++实现库. rt.jar ...

  5. struct in_addr 结构体

    struct in_addr 结构体: struct in_addr { in_addr_t s_addr; }; 表示一个32位的IPv4地址. in_addr_t一般为32位的unsigned i ...

  6. [九省联考 2018]一双木棋chess

    Description 题库链接 给出一个 \(n\times m\) 的棋盘,棋盘的每个格子有两个权值 \(A,B\) . Alice 和 Bob 轮流操作在棋盘上放棋子,一个格子能放棋子的前提条件 ...

  7. 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)

    相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...

  8. Linux进程管理四大工具ps \dstat\ top\ htop

    Linux进程管理之“四大名捕” 一.四大名捕 四大名捕,最初出现于温瑞安创作的武侠小说,是朝廷中正义力量诸葛小花的四大徒弟,四人各怀绝技,分别是轻功暗器高手“无情”.内功卓越的高手“铁手”.腿功惊人 ...

  9. JQuery判断浏览器类型(IE, Firefox…)

        1 2 3 4 5 6 7 8 9 10 11 $(function() {     if ($.browser.msie) {         alert("这是一个IE浏览器&q ...

  10. 【转】java线程池

    一简介线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util. ...