blog icon indicating copy to clipboard operation
blog copied to clipboard

在恋爱的世界里谈观察者模式

Open xxm-sz opened this issue 5 years ago • 1 comments

不知看这篇文章的你,是否一只孤独的单身汪~

如果是的话,让我告诉你恋爱的那件小事~

从本文,你可能会感悟到恋爱真经和学习到观察者模式。

爱情故事

心动的感觉

忙忙人海中,靠着左右手生活了二十来年的你,在刚从洗手间出来的刹那间,遇到那个想要过一生的人,怦然的心动....

从此变得不可收拾,你总是情不自禁,偷偷的观察她的一举一动,总是想知道她干嘛。也好想引起她的注意,可以你好怂。因为,喜欢一个人,就是小心翼翼的....

你终于忍不住了,不想错过对人了,鼓起了勇气,小碎步的走到她旁边,结结巴巴的,"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啦,支持好文,早日脱单

欢迎到GitHub Star

xxm-sz avatar Jul 11 '19 11:07 xxm-sz

不得house

hfkai avatar Aug 03 '20 07:08 hfkai