观察者模式(Observer Pattern),也常被称为发布-订阅模式。观察者通过注册加入被观察者通知对象,然后当被观察者内容发生变化的时候就可以通知注册了的对象。举个简单的例子:比如最常见的天气预报订阅服务,天气预报服务提供者就是一个被观察对象,而订阅了天气预报服务的就是观察者,每当天气发生变化(定时发送,重要变化才发送...)就会通知观察者。
观察者模式结构:
示例:
代码结构:
接口设计:
package cn.guyouda.designpattern.observer;
/**
*
* @author Youda
*
*/
public interface Subject {
/**
* 添加观察者
* @param observer
*/
void addObserver(Observer observer);
/**
* 移除观察者
* @param observer
*/
void removeObserver(Observer observer);
/**
* 通知所有观察者
*/
void notifyAllObservers();
}
package cn.guyouda.designpattern.observer;
/**
* 观察者接口
* @author Youda
*
*/
public interface Observer {
/**
* 收到消息时调用此方法
* @param message
*/
void update(String message);
}
被观察者实现:
package cn.guyouda.designpattern.observer;
import java.util.ArrayList;
import java.util.List;
public class Publisher implements Subject {
private List<Observer> observerList = new ArrayList<>();
private String message;
private static Publisher publisher = new Publisher();
private Publisher(){}
public static Publisher getInstance(){
return publisher;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
notifyAllObservers();
}
@Override
public void addObserver(Observer observer) {
if(observer == null){
throw new RuntimeException("Nullpoint Exception");
}
System.out.println("Publisher add a observer");
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(observer == null){
throw new RuntimeException("Nullpoint Exception");
}
System.out.println("Publisher remove a observer");
observerList.remove(observer);
}
@Override
public void notifyAllObservers() {
System.out.println("Publisher begin to send message");
for(Observer observer:observerList){
observer.update(message);
}
}
}
观察者1实现:
package cn.guyouda.designpattern.observer;
public class Observer1 implements Observer {
private String result = null;
public Observer1(Subject subject){
subject.addObserver(this);
}
@Override
public void update(String message) {
result = message;
display();
}
//输出收到的消息
private void display(){
System.out.println("Observer1 get message:"+result);
}
}
观察者2实现:
package cn.guyouda.designpattern.observer;
public class Observer2 implements Observer {
private String result = null;
public Observer2(Subject subject){
subject.addObserver(this);
}
@Override
public void update(String message) {
result = message;
display();
}
private void display(){
System.out.println("Observer2 get message:"+result);
}
}
测试类:
package cn.guyouda.designpattern.observer;
public class Test {
public static void main(String[] args) {
Publisher subject = Publisher.getInstance();
Observer observer1 = new Observer1(subject);
Observer observer2 = new Observer2(subject);
subject.setMessage("Hello,everyone! Today is sunny!!!!!!!");
subject.setMessage("Hello,everyone! Today is rainy!!!!!!!");
}
}
结果:
每当被观察对象属性变化的时候都会通知观察对象,观察者就可以根据收到的消息进行下一步逻辑操作