一不小心,小明在《跟着贝尔去冒险》这个真人秀节目中看到了“一日警察,一世警察”的Laughing哥,整个节目除了贝尔吃牛睾丸都不用刀叉的不雅餐饮文化外,还是镜头少普通话跟小明一样烂的Laughing Sir那种冷静和沉着稳定留下了深刻印象,不由想起电视剧《学警狙击》中为了不暴露钟立文的身份,要求向自己补一枪的警匪卧底巅峰推动者--Laughing 哥。
那么,卧底这样的工作,在我们程序里有没有呢?答案是肯定的,观察者模式。

文章内容思维导图

一.基本概念

1)KVC概念
  1. KVC全称Key-value coding.
  2. 一个非正式的Protocol,提供一种机制来间接访问对象的属性.

官方文档提供对KVC很准确的描述

Key-value coding is a mechanism for accessing an object’s properties indirectly, using strings to identify properties, rather than through invocation of an accessor method or accessing them directly through instance variables. In essence, key-value coding defines the patterns and method signatures that your application’s accessor methods implement.

2)KVO概念
  1. KVO全称Key-Value Observing。
  2. 典型的观察者模式承载者。
  3. 基于监控键值发生变化,通知观察者。
  4. KVO 就是基于 KVC 实现的关键技术之一。

官方文档提供对KVO很准确的描述

Key-value observing provides a mechanism that allows objects to be notified of changes to specific properties of other objects. It is particularly useful for communication between model and controller layers in an application.

二.KVC和KVO的作用

Laughing哥上场了,先看看怎么做卧底,首先,Laughing哥先得符合古惑仔行为准则混入黑帮;接着,除了放高利贷和Disco业务外最重的是挤兑从台湾出狱的世孝,选择站在亦天内心的一边得到足够多的信任;最后,凭借“一日警察,一世警察”赤诚初心,秉公执法端掉亦天和制毒窝点。

那么,你觉度Laughing Sir的作用是什么?

1. 接近需要得到信息隐秘或不隐秘的使用场所。
2. 直接监视信息的变化。
3. 当产生了有用的信息后,那马上通知汇报。

如果亦天制作的毒品比作信息,普通警察只能通过get方式属性,更重要是不知道他什么时候发生了变化。卧底Laughing Sir完美扮演的就是KVC和KVO机制,为什么说完美?KVC是可以直接通过路径获取对应的键的值,KVO的观察通知部分就对应Laughing Sir的监视和汇报,如果Laughing Sir变节了或者没有意志做下去了,那就只能是KVC能获取到信息,但不能通知上级信息的变化,就没有了一个经典的卧底角色Laughing了。

三.JAVA中的观察着模式

Sun公司早早就把观察者模式视为重要的模式,并在Java中提供方便的接口Observer和类Observable。这个地方注意一下,Observer是一个接口,Observable是一个类。因为很容易先入为主,XXXable第一反应是接口。如果看过《设计模式之禅》这本书的人,自然想起书中举的例子是李斯监视同窗韩非子的一举一动汇报给秦始皇。并且书中的Observer和Observable自定义定义刚好相反,注意下即可。为什么提Java,继续看吧。

四.代码实现

1. KVC属性读取和修改

1)Sense:
警官:梁笑棠,从今天开始 ,你的生命属于社会的,清楚吗?
Laughing Sir:清楚。
警官:出了这个学堂,你要叫Laughing 哥,记好了吗?
Laughing Sir:Yes sir。
警官:你妹,大声点。
Laughing Sir:_____

程序中,Laughing Sir被派于卧底工作前,需要把Laughing Sir的名字属性值更换成Laughing哥.我们就从这个地方开始练练手预热做卧底的体验吧。

2)Step:

①通过路径方式获取属性值

NSString *preName = [laughingSir valueForKey:@"name"];

②修改属性值

[laughingSir setValue:@"laughing 哥" forKey:@"name"];
3)Show Code:
NSString* exchangeName(LaughingSir *laughingSir){NSString *preName = [laughingSir valueForKey:@"name"];NSLog(@"laughing的旧名字:%@",preName);[laughingSir setValue:@"laughing 哥" forKey:@"name"];NSString *newName = [laughingSir valueForKey:@"name"];NSLog(@"laughing的新名字:%@",newName);return newName;
}

2.KVO观察者模式演绎

1)Sense:
亦天可能进行制毒。。。
Laughing Sir开始监控亦天
报告上级亦天制毒数:___

程序中,Laughing Sir开始观察YiTian这个实体类中的narcotics属性,一旦亦天制作出毒品,就马上observeValueForKeyPath通知上级,看看如下的具体实现。

2)Step:

①对被观察者添加观察

[self.yiTian addObserver:self forKeyPath:@"narcotics" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:nil];

②实现观察结果处理方法

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{//汇报上级
}
3)Show Code:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{if([keyPath isEqualToString:@"narcotics"]){NSNumber *narcoticsN = [change objectForKey:@"new"];//修改之后的最新值NSInteger narcotics = [narcoticsN integerValue];if (narcotics>0) {if (self.delegate!=nil&&[self.delegate respondsToSelector:@selector(reportYitian:)]) {[self.delegate reportYitian:narcotics];}}}
}

注意:留意下[change objectForKey:@"new"]其中这个new是指新赋予narcotics这个属性的值,当然也有一个old而不是[change objectForKey:@"narcotics"];narcotics是毒品意思。

3.Java实现观察者模式

这里我就直接显示关键代码了,不做过多说明,对比了解和学习。

/**
* 亦天实体类
* @author minggo
* @time 2016年4月1日 上午10:24:15*/
public class YITian extends Observable {private Observer observer;private int narcotics;@Overridepublic synchronized void addObserver(Observer o) {super.addObserver(o);this.observer = o;}public void MakeNarcotics(){for (int i = 0; i <3; i++) {narcotics++;if (observer!=null) {observer.update(this, narcotics);}}}}

留意Laughing Sir实体类的@override方法

/**
* Laughing Sir实体类
* @author minggo
* @time 2016年4月1日 上午9:58:36
*/
public class LaughingSir implements Observer{@Overridepublic void update(Observable o, Object arg) {if (o instanceof YITian) {System.out.println("监视到亦天制毒"+arg+"kg");}}public void watchOverYiTian(YITian yiTian){yiTian.addObserver(this);}
}

最后是测试main方法

/**
* 观察者模式
* @author minggo
* @time 2016年4月1日 上午10:36:37
*/
public class TestOberving {public static void main(String[] args) {YITian yiTian = new YITian();LaughingSir laughingSir = new LaughingSir();//Laughing Sir卧底开始监视亦天的一举一动laughingSir.watchOverYiTian(yiTian);System.out.println("Laughing Sir卧底开始监视亦天的一举一动");System.out.println("-----------亦天开始制作毒品--------");//亦天开始制毒yiTian.MakeNarcotics();System.out.println("-----------亦天结束制作毒品--------");}
}

五.现状下观察者模式的重要性

就犹如Laughing哥这样的角色,观察者模式在实际应用中起到重要的作用。无论你之前发现了,还是现在察觉到它的不可忽视。移动开发的MVVM开发架构思想中的重要解耦页面部分,就是观察者模式实现数据绑定,即时刷新数据。这个在iOS中KVO和Android使用Java的Observer接口都异曲同工之意,RxJava的响应是编程的基本思想也是观察者模式之艺术。

现状下的热门的移动开发的关键字,透漏出观察者模式显得越来越重要。其中就包括面试门槛,曾经面试过Android开发者还是iOS开发者,问到观察者这个模式可有了解?有回答iOS观察就是KVO,Java的就是在被观察对象添加回调接口,也有说过《设计模式之禅》中的韩非子被李斯监视的例子。

今天,有多了一个,Laughing哥卧底神话,个人感情建议使用这个例子,呵呵~。

六.效果图更直观

效果图

七.源码下载地址更详细

https://github.com/minggo620/iOSObserving.git

Laughing哥如果见到我,估计会说:“小明,其实我真实的名字叫~谢天华!”


【原创出品 未经授权 禁止转载】
【欢迎微友分享转发 禁止公号等未经授权的转载】

微信公众号:minggo_dev
文/minggo(简书作者)
原文链接:http://www.jianshu.com/p/b24d3829b978
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

谈KVC、KVO(重点观察者模式)机制编程相关推荐

  1. zzz KVC/KVO原理详解及编程指南

    前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的理解. 2.由于KVO内容较少,而且是以KVC为基础实现的,本文将着重介绍KVC部分. 一.简介 KVC/KVO是观察者模 ...

  2. KVC/KVO原理详解及编程指南

    作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注 ...

  3. KVC\KVO 简介

    KVC\KVO 简介 一.定义: 二.常见方法代码 KVC: KVC进阶用法: KVO: KVO 进阶用法: 三.用处 KVC: KVO: 四.MVVM.MVVMM架构 一.定义: KVC 是OC一个 ...

  4. 浅谈SQL Server内部运行机制

    原文:浅谈SQL Server内部运行机制 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL ...

  5. 浅谈ASP.NET的内部机制(一)

    浅谈ASP.NET的内部机制(一) 前言:当一个Http请求发送给一个aspx页面时,服务器进行了哪些操作?又如何来解析这个请求?ASP.NET在接收请求后是怎么运行的,如怎么编译以及怎么样用托管的代 ...

  6. 浅谈ASP.NET的内部机制(二)

    浅谈ASP.NET的内部机制(二)         前言:大家知不知道,一个Http Request是如何被传递给ASP.NET的?而且ASP.NET是如何知道一个 Http Request是请求的. ...

  7. EOS入门(8)---浅谈EOS的DPOS共识机制

    EOS入门(8)---浅谈EOS的DPOS共识机制  光_武 关注 2018.03.17 14:13 字数 3873 阅读 1534评论 1喜欢 2 本文参考汤强公众号的一篇文章坐看邻国领袖打高尔夫球 ...

  8. 浅谈python的垃圾回收机制以及内存管理

    背景介绍 Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早George E. Collins在1960的时候首次提出,50年后的今天,该算法依然 ...

  9. 深入理解 KVC\KVO 实现机制 — KVC

    KVC和KVO都属于键值编程而且底层实现机制都是isa-swizzing,所以本来想放在一起讲的.但是篇幅有限所以就分成了两篇博文 KVO实现机制传送门 KVC概述 KVC是Key Value Cod ...

最新文章

  1. 揭秘|多伦多大学反人脸识别,身份欺骗成功率达99.5%
  2. SQL Server表名为添加中括号[]执行出错
  3. Ubuntu apt 卸载详解
  4. 题解 P5301 【[GXOI/GZOI2019]宝牌一大堆】
  5. DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算
  6. 如何修改linux的java路径_修改桌面文件默认存储位置的正确方式及注意事项
  7. 高通孟樸:5G+AI将会是移动互联网主流趋势
  8. MaxCompute Studio使用心得系列3——可视化分析作业运行
  9. memcpy( )函数复制二维数组 memcmp( )函数比较二维数组
  10. PCWorld评出的2010年世界杀毒软件排名
  11. 数字电视的格式(BT.601 BT.709 BT.2020)和接口(BT.656 BT.1120 BT.2077)
  12. DID 起步:图说去中心化身份 | ArcBlock 博客
  13. 关于word使用之三线表制作
  14. 天池大数据竞赛-河北高校邀请赛——二手车交易价格预测-初赛第22名
  15. 几款极好的 JavaScript 文件上传插件
  16. Linux实用教程(第三版)
  17. gsoap linux中文乱码,gsoap中文乱码及内存清理等问题的解决方案
  18. elementui的表单验证踩坑-动态绑定输入框required后只显示英文提示
  19. 已知数据库中存在表tb_book2,通过在图书信息界面填写书本的基本信息,然后提交后写入数据库中的表格中。需要对提交的信息进行修改,信息填入不能为空,为空则则有提示。
  20. Java语言程序设计与数据结构(基础篇)梁勇第二章书中例题

热门文章

  1. Mybatis3基础示例
  2. #visual studio# 运行库MT、MTd、MD、MDd
  3. HDD深圳站:全生命周期赋能开发者,华为引领应用生态升级
  4. EE308-Lab8-AlphaSprint-Day6
  5. 改装智能锁,或是ofo“学习”摩拜的开始!
  6. python数据分析建模-十分钟搞懂“Python数据分析”
  7. 朱清时:中国大学首要问题是如何让学生学到真本事
  8. 前端 day 30 html 基础一
  9. 【python安装】其他支持库的安装
  10. 需要安装Directx9.0c以上版本和最新显卡驱动