一:观察者模式
1.引出问题
当一个系统如何去发布通知,并且及时的通知用户,通知用户并进行反馈。这里我们就引出一个新的模式:观察模式。观察者模式的结构原理图如下:
2.引出概念
从上图可以看到有以下几个概念:
主题:又叫被观察者对象,用来发布消息
订阅:又叫观察者,用来接收消息
二:代码
1.订阅抽象
package test;
/**
* 订阅(即观察对象)
* @author monxz
*
* @time 2019年7月29日
*/
public interface Observer {
//更新
public void update(String msg);
}
2.主题抽象
package test;
/**
* 主题:(即被观察的对象)
* @author monxz
*
* @time 2019年7月29日
*/
public interface Subject {
//添加观察者
public void addObserver(Observer obs);
//删除观察者
public void removeObserver(Observer obs);
//消息通知
public void noty(String msg);
}
3.主题实现
package test;
import java.util.ArrayList;
import java.util.List;
/**
* 主题的实现
* @author monxz
*
* @time 2019年7月29日
*/
public class SubjectImpl implements Subject{
//观察者的存储集合
private List<Observer> obsList=new ArrayList<Observer>();
@Override
public void addObserver(Observer obs) {
obsList.add(obs);
}
@Override
public void removeObserver(Observer obs) {
obsList.remove(obs);
}
@Override
public void noty(String msg) {
if(obsList != null && obsList.size() != 0) {
obsList.forEach(o->{
o.update(msg);
});
}
}
}
4.订阅实现
package test;
/**
* 观察者的实现
*
* @author monxz
*
* @time 2019年7月29日
*/
public class User implements Observer{
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public User(String userName) {
super();
this.userName = userName;
}
@Override
public void update(String msg) {
System.err.println(userName+"接收到推送信息:"+msg);
}
}
5.测试
package test;
public class test {
public static void main(String[] args) {
Subject sb= new SubjectImpl();
User u1=new User("u1");
User u2=new User("u2");
User u3=new User("u3");
sb.addObserver(u1);
sb.addObserver(u2);
sb.addObserver(u3);
sb.noty("广播总站通知:近俩天将有大暴雨!!! 时间:2019-07-30");
sb.removeObserver(u2);
sb.noty("广播总站通知:近俩天将有大暴雨!!! 时间:2019-07-31");
}
}
三:说明
其实在一些消息中间件中,有这样一些分组消息,实际就是过滤条件