blog
blog copied to clipboard
在恋爱的世界里谈观察者模式
不知看这篇文章的你,是否一只孤独的单身汪~
如果是的话,让我告诉你恋爱的那件小事~
从本文,你可能会感悟到恋爱真经和学习到观察者模式。
爱情故事
心动的感觉
忙忙人海中,靠着左右手生活了二十来年的你,在刚从洗手间出来的刹那间,遇到那个想要过一生的人,怦然的心动....
从此变得不可收拾,你总是情不自禁,偷偷的观察她的一举一动,总是想知道她干嘛。也好想引起她的注意,可以你好怂。因为,喜欢一个人,就是小心翼翼的....
你终于忍不住了,不想错过对人了,鼓起了勇气,小碎步的走到她旁边,结结巴巴的,"Hi,我是...是....技术部的XXX,可以...可以加你微信么?"
然后,你的通讯录里有了她的名字。可是,你变了,总是傻傻的盯着她名字,打开了聊天框又关了,一直这样重复重复着...
今天,直男癌晚期的你,喝了口江小白,紧张的给她发了人生第一句招呼:“Hello,my world!”
“在,有什么事么?”
“没事,有点无聊”
“哦哦哦”
“上个月碰到你,被你深深的吸引了,能不能和你进一步的发展,做个朋友呢”
“可以呀,多个朋友多条路”
“谢谢”
此时,你开心到起飞,你的心已经在天空飘来飘去~
小姐姐默默把你加入到帅哥列表中...
在你喜欢小姐姐那一刻起,你就变成了观察者,小姐姐就变成了被观察者。因为关心小姐姐的生活,所以被成功加入姐姐的帅哥列表中,表示你和小姐姐产生了订阅关系。
幸福的感觉
就这样,每天在微信偶尔聊聊天,打打招呼。但妹纸只有在自己有困难的时候才会主动找你,例如帮忙修电脑。
今天,妹纸的电脑又坏了,妹纸问了帅锅列表的所有人,“Hi,我电脑坏了,有空帮我修一下么?”每个帅锅都收到了,但他们顾着撩其他妹纸,没空。
只有你有空,于是你兴高采烈的帮忙修电脑,妹纸给你端来的温水,给你擦擦,好幸福哦。。。
小姐姐在自己的生活,也就是你关心的事发生变化时,例如电脑坏了,就会告知列表里的孩子们,让他们知道,以让他们决定是否做点事。例如这里你会去修电脑。
心累的感觉
慢慢的相处来,你发现自己心累了,感觉没啥意思,因为小姐姐平常没事都不搭理你,有困难才找你。你很想把小姐姐占为己有,很想天天和她待在一起,于是你对小姐姐说:
“做我女朋友吧”
“额,你是好人”
“让我照顾你吧”
“你是个很好的朋友”
“那我们分手吧”
“都没恋爱过,哪来的分手”
你伤心了好久,觉得是自己不够爱,或许真爱就是放手吧。你沮丧的对小姐姐说不要再联系了,小姐姐二话没说就从帅锅列表把你移除了。于是你们两就断了关系了,除非你重新向小姐姐表明爱意。
这时候的你们就是解注册,小姐姐发生什么事再也不会通知你。
听完故事,咱们还是面对现实,好好敲代码,看文章,来聊聊观察者模式吧。
观察者模式
如上文所示,观察者模式涉及到观察者和被观察者,观察者需要向被观察者注册,产生订阅关系。被观察者可以持有多个观察者,在自身相关事件发生变化的时候通知所有订阅该事件的观察者。观察者对事件不再感兴趣,需要向被观察者解注册。
一般为了程序的灵活和扩展,都会将观察者和实现者抽象为一个接口,再由具体的实现类去实现接口。
下面举个简单的栗子:
被观察者
定义一个被观察者接口,具有注册和解注册函数。
public interface Observable<T> {
void register(T obj);
void unregister(T obj);
}
在定义一个具体的被观察者,例如上文的女孩,持有一个集合,用来保存对其感兴趣的观察者。有一个repairComputer()
函数,用来在事件发生变化时,通知帅锅们来帮忙修电脑。
public class GirlObservable implements Observable<Observer> {
private List<Observer> observers = new ArrayList<>();
@Override
public void register(Observer observer) {
observers.add(observer);
}
@Override
public void unregister(Observer observer) {
observers.remove(observer);
}
public void repairComputer(){
for (Observer observer:observers){
observer.call("电脑坏了,来帮我修吧");
}
}
}
观察者
抽象一个观察者接口,例如拥有一个call()函数,这样当我们关心被观察者的事改变时,才能得到通知。
public interface Observer {
void call(String msg);
}
再定义两个具体的观察者,实现call()函数,在被 被观察者通知的时候,根据自身逻辑做相关处理。
public class ZhangsanObserver implements Observer {
@Override
public void call(String msg) {
System.out.println("我是张三,现在没空帮你");
}
}
public class LisiObaserver implements Observer {
@Override
public void call(String msg) {
System.out.println("好呀,我马上就来帮你修电脑");
}
}
订阅和发展
有了观察者和被观察者,那么就要发生订阅关系,不然就失去了意义。
//张三对象
Observer zhangsan=new ZhangsanObserver();
//李四对象
Observer lisi=new LisiObaserver();
//女孩对象
GirlObservable girl=new GirlObservable();
//向女孩注册张三
girl.register(zhangsan);
//向女孩注册李四
girl.register(lisi);
//女孩的电脑坏了,请求帮忙
girl.repairComputer();
//对女孩不感兴趣了,张三解注册
girl.unregister(zhangsan);
//对女孩不感兴趣了,李四解注册
girl.unregister(lisi);
从上文,观察者模式很容易理解,从栗子来看也很简单,却能有效的降低耦合,让具体的对象依赖于抽象,但其中一方逻辑变更不会影响另一方。,观察者模式在实际开发中得到很大的推广,如EventBus、Android的广播、setOnClikLisenter事件等。
点个Star啦,支持好文,早日脱单
不得house