设计模式--观察者模式

Posted fating

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--观察者模式相关的知识,希望对你有一定的参考价值。

一、概述

1、观察者模式:(Observer Pattern)

2、使用场景:订阅消息与发布消息是最好的观察者模式,观察者模式使用比较频繁。

3、角色:

  A、Subject:主题,绑定观察者。

  B、Observer:观察者角色

  C、Client:使用场景。

二、例子

  模拟微信中订阅一个主题,主题发布消息时后的一个例子。

  A、Subject:主题,绑定观察者。

技术图片
 1 package comm.pattern.action.observer.push;
 2 
 3 /**
 4  * 
 5  * @Title: ISubjectPush.java
 6  * @Package: comm.pattern.action.observer.push
 7  * @Description: 主题接口
 8  * @author yangzhancheng
 9  * @2020年3月3日:下午10:38:22
10  *
11  */
12 public interface ISubjectPush {
13     
14     //注册观察者
15     void registerObserver(IObserverPush observerPush);
16     
17     //注销观察者
18     void unregisterObserver(IObserverPush observerPush);
19     
20     //推送消息
21     void pushMessage(String message);
22 
23 }
View Code

      A-1:主题实现类

技术图片
 1 package comm.pattern.action.observer.push;
 2 
 3 import java.util.ArrayList;
 4 
 5 /**
 6  * 
 7  * @Title: SubjectPush.java
 8  * @Package: comm.pattern.action.observer.push
 9  * @Description: 主题
10  * @author yangzhancheng
11  * @2020年3月3日:下午10:41:58
12  *
13  */
14 public class SubjectPush implements ISubjectPush {
15 
16     private ArrayList<IObserverPush> observerPushList = new ArrayList<IObserverPush>();
17     
18     @Override
19     public void registerObserver(IObserverPush observerPush) {
20         if(null == observerPush){
21             return;
22         }
23         observerPushList.add(observerPush);
24     }
25 
26     @Override
27     public void unregisterObserver(IObserverPush observerPush) {
28         if(null == observerPush){
29             return;
30         }
31         observerPushList.remove(observerPush);
32     }
33 
34     
35     @Override
36     public void pushMessage(String message) {
37         System.out.println("准备推送主题:");
38         
39         for(IObserverPush observerPush:observerPushList){
40             observerPush.updateMessate(message);
41         }
42         
43     }
44 
45 }
View Code

  B、Observer:观察者角色

技术图片
 1 package comm.pattern.action.observer.push;
 2 
 3 /**
 4  * 
 5  * @Title: IObserverPush.java
 6  * @Package: comm.pattern.action.observer.push
 7  * @Description: 观察者接口
 8  * @author yangzhancheng
 9  * @2020年3月3日:下午10:46:18
10  *
11  */
12 public interface IObserverPush {
13     
14     void  updateMessate(String message);
15 
16 }
View Code

      B-1:观察者实现类

技术图片
 1 package comm.pattern.action.observer.push;
 2 
 3 /**
 4  * 
 5  * @Title: ObserverPush.java
 6  * @Package: comm.pattern.action.observer.push
 7  * @Description: 观察者实现类
 8  * @author yangzhancheng
 9  * @2020年3月3日:下午10:54:32
10  *
11  */
12 public class ObserverPush implements IObserverPush {
13 
14     private String userName;
15     
16     public ObserverPush(String userName){
17         this.userName = userName;
18     }
19     
20     @Override
21     public void updateMessate(String message) {
22         System.out.println("用户:"+userName+"接收到的消息为:"+message);
23     }
24 
25 }
View Code

  C、Client:使用场景。

技术图片
 1 package comm.pattern.action.observer.push;
 2 
 3 /**
 4  * 
 5  * @Title: ClientPush.java
 6  * @Package: comm.pattern.action.observer.push
 7  * @Description: 客户端实现类
 8  * @author yangzhancheng
 9  * @2020年3月3日:下午10:55:27
10  *
11  */
12 
13 public class ClientPush {
14     
15     public static void main(String[] args){
16         
17         //微信用户注册
18         ISubjectPush subjectPush = new SubjectPush();
19                 
20         IObserverPush observerPushZ = new ObserverPush("张三");
21         IObserverPush observerPushL = new ObserverPush("李三");
22         IObserverPush observerPushW = new ObserverPush("王五");
23         
24         subjectPush.registerObserver(observerPushZ);
25         subjectPush.registerObserver(observerPushL);
26         subjectPush.registerObserver(observerPushW);
27         
28         //发送消息
29         subjectPush.pushMessage("大家好,带三的都是好人");
30         
31         //王五不高兴了,取消关注
32         subjectPush.unregisterObserver(observerPushW);
33         subjectPush.pushMessage("大家好,我给大家发红包");
34         
35     }
36 
37 }
View Code

    运行结果

准备推送主题:
用户:张三接收到的消息为:大家好,带三的都是好人
用户:李三接收到的消息为:大家好,带三的都是好人
用户:王五接收到的消息为:大家好,带三的都是好人
准备推送主题:
用户:张三接收到的消息为:大家好,我给大家发红包
用户:李三接收到的消息为:大家好,我给大家发红包

 

三、总结

     后期补充吧。主要是和其他模式的比较。

以上是关于设计模式--观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式

未调用 LiveData 观察者

设计模式之美(c++)-笔记-56-观察者模式

设计模式之美(c++)-笔记-56-观察者模式