美文网首页
英雄联盟中的设计模式-观察者模式

英雄联盟中的设计模式-观察者模式

作者: 莮亾 | 来源:发表于2016-12-22 23:00 被阅读24次

定义对象之间的一对多依赖,这样当一个对象改变状态时,他的所有依赖者都会收到通知并完成更新。

有一天,老板兴高采烈的对我说:“当某个召唤师在打野的时候被野怪杀死,是不是该羞辱他一下?” 没错,当这种情况发生,应该第一时间通知他的队友,要认真play!


对于这种一对多的关系,当然会想到观察者模式。很多高级编程语言库中都会提供相应的API,例如iOS中的NSNotificationCenter类。但是,接下来讨论的是如何自己去实现更加灵活的观察者模式。

一般将观察者模式分为“主题”与“订阅者”两部分。主题可以增加、删除订阅者,并且当特定的事件发生后,会通知所有的订阅者;而订阅者则是收到通知后更新自己的一些行为。

首先要定义Subject和Observer接口(协议),然后定义一个具体主题类BlueBuff,用于实现Subject接口(协议),定义三个订阅者类Summoner1、Summoner2、Summoner3,用于实现Observer接口(协议),如下图:


图1

每当主题有变化,就会通知订阅者,这样的设计其实不够灵活、高效。就拿BlueBuff跟Summoner来说,对于BlueBuff的每次攻击,Summoner并不想都收到通知,而是某次攻击KO了对方,才希望得到通知。因此在Subject中添加了isChanged变量,用来控制某个特定的时间点才发送通知给订阅者们。

另外,对于所有的订阅者,他们感兴趣的数据可能并不相同,那么主题将全部的数据通知给订阅者,显然有些多余。其实可以设计成让订阅者主动去到主题中拉取感兴趣的数据,这样需要在主题类中留出拉取部分通知数据的方法,例如下面对图1的更改:


[具体实现代码(iOS)](https://github.com/liangjie-MrJie/ObserverPattern)

接下来简单描述一下iOS中的观察者模式NSNotificationCenter类:

[相关代码见LJNSNotificationCenter类](https://github.com/liangjie-MrJie/ObserverPattern)

在使用NSNotificationCenter类时,aName字符串最好能清晰的描述出observer对象与SEL结构来,比如在ViewController类中这样使用addObserver:selector:name:object方法:

[[NSNotificationCenter defaultCenter] addObserver:self 
                                      selector:@selector(ljaction:) 
                                      name:@"AppDelegate+ViewController+ljaction"
                                      object:nil];

aName被定义为AppDelegate+ViewController+ljaction,意思就是ViewController、AppDelegate类中的ljaction方法。这样在得到观察者模式带来的松耦合的同时,也不至于失去逻辑追踪的线索。


倾情告白:使用观察者模式达到了松耦合的设计目的,能够建立更有弹性的OO系统。

关注微信公众号CodingArtist,可以第一时间得到文章更新通知! _

相关文章

网友评论

      本文标题:英雄联盟中的设计模式-观察者模式

      本文链接:https://www.haomeiwen.com/subject/iteqvttx.html