聊聊协议和对象

前言

在Objective-C中,protocol和继承区别还是蛮大的:

   @interface TestClass : TestFatherClass <TestProtocol>@end

讲的是,一个类TestClass,是继承自类TestFatherClass的子类,并遵守TestProtocol协议。

在Swift中,就看不出来了:

  class TestClass : TestFatherClass , TestProtocol {   }

也就是说在swift中面相协议更加被看重了,面向对象编程思想的基础上,更加推荐面向协议编程的思想了。

协议是什么?

首先跳出编程,协议是什么?

场景描述:甲方乙方为了实现一个目标A,拟定了协议B,双方承诺共同遵守协议,协议B中提到,场景C的时候,遵守协议的人要做D这件事。

现在甲方遇到了场景C,在遵守协议的原则下,甲方做了D这件事,最终甲方的目标A实现了。

当然这是非常理想的状况。

那么iOS的协议是什么呢?

A protocol declares a programmatic interface that any class may choose to implement. Protocols make it possible for two classes distantly related by inheritance to communicate with each other to accomplish a certain goal. They thus offer an alternative to subclassing. Any class that can provide behavior useful to other classes may declare a programmatic interface for vending that behavior anonymously. Any other class may choose to adopt the protocol and implement one or more of its methods, thereby making use of the behavior. The class that declares a protocol is expected to call the methods in the protocol if they are implemented by the protocol adopter.

实际上是一样的:

甲方类和乙方类为了实现功能A,遵守了协议B,协议B中有方法D,是在场景C的情况下要做D这件事。

那么在场景C的时候,D方法被执行了,最终实现了功能A。

有点绕是不是?

用对象和协议实现同一个详细的场景(有点啰嗦,但是非常实际的例子)

举个更详细一点的例子:

有按钮A,对应:人类小明

现在要实现需求:点击按钮的时候,打印对应类的对应名字+“你好!”

umm...怎么实现呢?界面好说,刷刷刷就写好了A按钮。点击事件怎么写呢?首先考虑的应该是对象。

写一个类,是人类,属性有名字,方法有打招呼。小明是人类,名字是小明,实现方法打招呼:打印“{.名字}你好!”

ok,需求解决了,歇了口气,so easy!

第二天,需求改了:

有按钮A两个,对应:人类小明;人类小红,她的昵称是红红。

现在要实现需求:点击按钮的时候,打印对应类的对应名字+“你好!”,小明显示小明,小红显示红红。

****!产品经理拖出去枪毙!小明和红红是什么鬼?为什么不打印小红呢?算了,强压怒火,改改改:

人类这个类里添加属性:昵称,打招呼的时候添加判断,如果昵称不为空,显示昵称,如果昵称为空,显示名字

哼哼,难不倒我的,再次解决。

第三天,需求又变了:

有按钮A3个,对应:人类小明;人类小红,她的昵称是红红;小狗小花。

现在要实现需求:点击按钮的时候,打印对应类的对应名字+“你好!”,小明显示小明,小红显示红红,小狗显示小花。

********!给产品经理扎个娃娃,天天刺刺刺!不过饭碗不能丢,依然要实现它:

代码不能太难看,重构一下,动物类,属性:名字,方法:打招呼(打印“{.名字}你好!”),人类,继承自动物类(人也是动物嘛),属性多一个昵称,在打招呼方法添加判断,如果昵称是空,super,如果昵称不为空,打印“{.昵称}你好!”

写完之后就开始担心了,如果哪一天产品经理突发奇想添加个汽车按钮怎么办?撞死算了。他应该不会那么无情无耻无理取闹吧?

呵呵,偏偏第四天,产品经理告诉你,他就是这么无情无耻无理取闹,汽车不错,就加个汽车好了!

有按钮A4个,对应:人类小明;人类小红,她的昵称是红红;小狗小花;大众汽车,他的种类是高尔夫,型号是xyz123。

现在要实现需求:点击按钮的时候,打印对应类的对应名字+“你好!”,小明显示小明,小红显示红红,小狗显示小花,汽车显示高尔夫xyz123。

是不是觉得这样下去不是个事了?单纯面向对象开发似乎已经不足以快速实现需求了,每次更迭如果脱离现有的数据结构,就会有重构的必要,时间成本和调试成本大大增加,协议这个东西的作用体现出来了

协议:对它打招呼,有一个属性:称呼

点击事件打印:{遵守协议:对它打招呼的类的称呼}+“你好!”

人类,名字小明;人类,名字小红,昵称红红。

想要对他们打招呼只要让人类遵守协议:对它打招呼,然后赋值时候,顺便判断下,如果昵称不为空,就让称呼是昵称,如果昵称为空,就让称呼是名字。

ok,管他加小狗还是汽车呢,只要让它遵守协议:对它打招呼,把产品经理打招呼的时候要显示的称呼给“称呼”赋值,要来多少都没事了。

总结

你如果觉得你的产品经理没这么坑,我觉得你还是预防万一为好,我维护一个2年的产品,为了满足多变的需求,定制了无数协议,现在看起来真的很好维护。

对象继承的特点:实现起来容易,但是扩展和维护麻烦

协议的特点:实现起来要定制协议,可能有点麻烦,但是耦合性非常低,利于维护,扩展性很强。

能用协议的地方,还是多用吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,022评论 4 62
  • 眼里在乎的你, 心里想念的你, 梦里出现的你, 那一个非常害怕失去的你, 所以我捧在手心, 所以我加倍珍惜。 太多...
    晨风世界阅读 274评论 0 1
  • 一:为什么要实现负载均衡 当一台服务器的单位时间内访问量越大的时候,服务器压力会越大,当一台服务器压力大得超过自身...
    芷_念阅读 419评论 0 0
  • 在爱情里, 男的要是一直宠着女的就能谈很长时间并且感情特别好 ,要是女的一直忍让男的,这段感情就不会太久 因为说句...
    笃学青衿阅读 83评论 0 0