一、概述
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
运行结果
准备推送主题: 用户:张三接收到的消息为:大家好,带三的都是好人 用户:李三接收到的消息为:大家好,带三的都是好人 用户:王五接收到的消息为:大家好,带三的都是好人 准备推送主题: 用户:张三接收到的消息为:大家好,我给大家发红包 用户:李三接收到的消息为:大家好,我给大家发红包
三、总结
后期补充吧。主要是和其他模式的比较。