观察者模式
观察者模式的定义:
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
在Think in java 中 是这样解释它的:
观察器(Observer)范式解决的是一个相当普通的问题:由于某些对象的状态发生了改变,所以一组对象都 需要更新,那么该如何解决?在Smalltalk 的MVC(模型-视图-控制器)的“模型-视图”部分中,或在 几乎等价的“文档-视图结构”中,大家可以看到这个问题。现在我们有一些数据(“文档”)以及多个视 图,假定为一张图(Plot)和一个文本视图。若改变了数据,两个视图必须知道对自己进行更新,而那正是 “观察器”要负责的工作。(在java.util 中还有Observer 接口)
package cn.myproject.hzq.designpattern.observer;
/**
* 抽象被观察者接口
* @author hzq
**/
public interface Observable {
/**
* 注册观察者
* @param observer 观察者
*/
void registerObserver(Observer observer);
/**
* 移除观察者
* @param observer 观察者
*/
void removeObserver(Observer observer);
/**
* 唤醒所有的观察者
*/
void notifyObserver();
}
package cn.myproject.hzq.designpattern.observer;
/**
* 抽象观察者
* 定义了一个update()方法,当被观察者调用notifyObservers()方法时
,观察者的update()方法会被回调。
* @author hzq
**/
public interface Observer {
/**
* 模拟消息
* @param message 更新消息
*/
void update(String message);
}
package cn.myproject.hzq.designpattern.observer;
import java.util.ArrayList;
import java.util.List;
/**
* 被观察者
* @author hzq
**/
public class BeObserver implements Observable {
//注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程
private List<Observer> list;
private String message;
public BeObserver() {
list = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(null != observer) {
list.remove(observer);
}
}
@Override
public void notifyObserver() {
for(Observer server : list){
server.update(message);
}
}
/**
* 设置唤醒的消息
* @param message 消息
*/
public void setInfomation(String message){
this.message = message;
System.out.println("新的消息:"+message);
notifyObserver();
}
}
package cn.myproject.hzq.designpattern.observer;
/**
* 具体的观察者对象
* @author hzq
**/
public class UserObserver implements Observer{
private String name;
private String message;
public UserObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
read();
}
/**
* 模拟读取消息
*/
public void read(){
System.out.println(name + " 收到推送消息: "
+ this.message);
}
}
package cn.myproject.hzq.designpattern.observer;
/**
* 观察者模式测试
* MVC
* @author hzq
**/
public class ObserverTest {
public static void main(String[] args){
BeObserver beObserver = new BeObserver();
UserObserver Lin = new UserObserver("Lin");
beObserver.registerObserver(Lin);
UserObserver Wang = new UserObserver("Wang");
beObserver.registerObserver(Wang);
UserObserver Sun = new UserObserver("Sun");
beObserver.registerObserver(Sun);
beObserver.setInfomation("大家好");
System.out.println("分割线----------------------");
beObserver.removeObserver(Lin);
beObserver.setInfomation("谁不见了?");
}
}