1.定义
观察者模式(Observer Pattern) 定义了对象之间一对多依赖
让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(监听者)都会收到通知并更新
属于行为型模式
也叫作发布订阅模式
2.JDK实现
/**
* Description:论坛(被观察者)
*
* @date 2019-05-28 20:25
*/
public class Forum extends Observable {
private String name = "XX论坛";
private static Forum instance;
private Forum() {
}
public static Forum getInstance() {
if (instance == null) {
instance = new Forum();
}
return instance;
}
public String getName() {
return name;
}
public void publish(Question question) {
System.out.println(question.getUserName() + "发布一个问题,具体内容为:" + question.getContent());
setChanged();
notifyObservers(question);
}
}
/**
* Description:问题
*
* @date 2019-05-28 20:36
*/
public class Question {
private String userName;
private String content;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
/**
* Description:版主(观察者)
*
* @date 2019-05-28 20:38
*/
public class Moderator implements Observer {
private String name;
public Moderator(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
Forum forum = (Forum)o;
Question question = (Question)arg;
System.out.println("======================================");
System.out.println(name+"版主,你好"+"\n"
+question.getUserName()+"在 <"+forum.getName()+"> 发布了一个问题,\n"
+"内容:"+question.getContent());
}
}
/**
* Description:测试类
*
* @date 2019-05-28 20:44
*/
public class Test {
public static void main(String[] args) {
Forum forum = Forum.getInstance();
Moderator a = new Moderator("A版主");
Moderator b = new Moderator("B版主");
Question question = new Question();
question.setUserName("小白");
question.setContent("花儿为什么这样红?");
forum.addObserver(a);
forum.addObserver(b);
forum.publish(question);
}
}
3.guava实现
public class GuavaEvent {
@Subscribe
public void subscribe(String src){
System.out.println("执行GuavaEvent 类的subscribe("+src+")方法");
}
}
public class Test {
public static void main(String[] args) {
//消息总线
EventBus eventBus = new EventBus();
GuavaEvent guavaEvent = new GuavaEvent();
eventBus.register(guavaEvent);
eventBus.post("sKy");
}
}