【Java设计模式】观察者模式
适用于消息订阅,通知发布等场景:
//被观察者
public interface Observed {
/**
* 注册观察者
* @param o
* 观察者
*/
void registerObserver(Observer o);
/**
* 移除观察者
* @param o
* 观察者
*/
void removeObserver(Observer o);
/**
* 唤醒观察者
*/
void notifyObserver();
}
//观察者
public interface Observer {
void update(String message);
}
//被观察者实现类,即被订阅方
public class Producer implements Observed {
private List<Observer> list = new LinkedList();
private String msg;
@Override
public void registerObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
list.remove(o);
}
@Override
public void notifyObserver() {
for (Observer o : list){
o.update(msg);
}
}
public void setMsg(String msg) {
this.msg = msg;
System.out.println("发布消息:"+msg);
notifyObserver();
}
}
//观察者实现类,即用户方
public class User implements Observer {
private String msg;
private String name;
public User(String name){
this.name = name;
}
@Override
public void update(String message) {
this.msg = message;
read();
}
public void read(){
System.out.println(this.name + " 收到消息:"+msg);
}
}
//测试类
public class Test {
public static void main(String[] args) {
User user1 = new User("悟空");
User user2 = new User("八戒");
User user3 = new User("沙僧");
Producer producer = new Producer();
producer.registerObserver(user1);
producer.registerObserver(user2);
producer.registerObserver(user3);
producer.setMsg("饿死了,还没吃饭");
producer.removeObserver(user2);
producer.setMsg("困死了,还没睡觉");
}
}
//输出
发布消息:饿死了,还没吃饭
悟空 收到消息:饿死了,还没吃饭
八戒 收到消息:饿死了,还没吃饭
沙僧 收到消息:饿死了,还没吃饭
发布消息:困死了,还没睡觉
悟空 收到消息:困死了,还没睡觉
沙僧 收到消息:困死了,还没睡觉
网络上志同道合,我们一起学习网络安全,一起进步,QQ群:694839022