1.定义
观察者模式是一种行为型模式,又称发布-订阅模式(Publish-Subscribe:Pub/Sub)。它是一种通知机制,让发送通知的一方(被观察方)和接收通知的一方(观察者)能彼此分离,互不影响。
无论是QQ还是微信都有群聊功能,只要在群中的任意成员发布一条消息,那么整个群中所有的用户都会收到消息。这所有的用户仿佛都是一个观察者,时刻在观察群中是否有新消息,如果有新的消息,那么马上通知群里除了屏蔽群消息的用户。
2.观察者模式结构图
GroupChat是群的抽象,其中引用了Observer也就是群中的用户,同时拥有对用户的新增、删除、产生消息以及消息通知方法。ConcreteGroupChat是GroupChat的具体实现,所以继承于GroupChat。而Observer是对用户的抽象即观察者的抽象,其中包含了一个写消息的方法,相当于将消息发给对应的用户,进行展示。而User则是对Observer具体的实现。
3.观察者模式实现
GroupChat中引用了Observer,用于保存群中的用户,当然其中还包含了对用户的新增、删除、产生消息以及消息通知方法。消息通知就是把消息推送给群里的所有用户。
ConcreteGroupChat是具体的群,为了方便演示,没有定义群的基本信息,例如群名称等信息,只是将群的消息产生使用了一个随机数字来产生。
Observer就是观察者,用于观察群中消息的产生,但是Observer只是抽象的观察者,只是定义方法,而不做具体的实现,具体怎么做是子类的事情。
User就是具体的观察者,实现于Observer,对于消息接受到以后怎么处理都是通过实现writeMessage方法,文中只是做了消息的打印,谁接受到了消息。
下面我们新建了一个群,同时添加群中成员为张三和李四,然后调用群的产生消息方法,此时可以看到张三和李四分别都收到了10条消息。
观察者模式中登场的角色
Subject(观察对象),Subject角色,相当于被观察的对象,文中由GroupChat扮演此角色
ConcreteSubject(具体的观察对象),ConcreteSubject角色,是对Subject的具体实现,文中由ConcreteGroupChat扮演此角色。
Observer(观察者),Observer角色,是观察消息的变化,文中由Observer类扮演此角色
ConcreteObserver(具体的观察者),是对Observer的具体实现,文中由User类进行扮演此角色。
参考文献《图解设计模式》
代码获取地址:https://gitee.com/bughong/design-pattern