观察者模式 Observer Model
观察者模式也就是发布订阅模式,是一种对象的行为模式,也是一种一对多的依赖关系,即可以让多个观察者同时监视一个被观察者的状态变化,当被观察者的状态发生改变,此时被观察者将通知所有观察者自身已经发生了改变时观察者和被观察者同步。
PS:一对多的关系就是一个被观察者可以对应多个观察者。
观察者模式案例实现
-
java中
- 被观察者需要继承java.util.Observable类
- 观察者需要实现java.util.Observer接口并实现update方法
- 被观察者的实现代码
构造方法私有化(使用单例模式)
定义可以增加观察者的方法
最重要的方法是改变自身状态的方法也就是addBook(…)这个方法更新了自身之后,调用setChanged方法告诉观察者们当前自己发生了变化,最后通过notifyObservers告知观察者做出相应的响应,同时将更新的内容作为参数传递给观察者。
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* 被观察者 以书籍上线通知为例
* @author WW
*/
public class BookList extends Observable{
//书籍列表
private List<String> books = null;
//单例模式 这个类的唯一实例
private static BookList bookList;
//单例模式 构造方法私有化
private BookList() {
}
//单例模式 返回该类实例的方法
/**
* 取得唯一实例
* @return 书籍列表的唯一实例
*/
public static BookList getBookList() {
if (bookList == null) {
bookList = new BookList();
bookList.books = new ArrayList<String>();
}
return bookList;
}
/**
* 增加观察者
* @param observer 观察者
*/
public void addBookListObserver(Observer observer) {
this.addObserver(observer);
}
/**
* 新增书籍
* @param bookname 新书籍名字
*/
public void addBook(String bookname) {
books.add(bookname);
System.out.println("书籍列表新增了一本书籍,书名为::" + bookname);
//设置被观察对象发生变化
this.setChanged();
//通知观察者自身新增数据
this.notifyObservers(bookname);
}
}
- 观察者的实现代码,此案例以两个观察者为例,两者代码大致相同
import java.util.Observable;
import java.util.Observer;
/**
* 观察者 1
* @author WW
*/
public class Observer1 implements Observer{
@Override
public void update(Observable o, Object book) {
String bookname = (String) book;
System.out.println("新书籍上线-->" + bookname + "<-- 已经同步到观察者 1 的位置");
}
}
/******************************************************************************************************************/
import java.util.Observable;
import java.util.Observer;
/**
* 观察者 2
* @author WW
*/
public class Observer2 implements Observer{
@Override
public void update(Observable o, Object book) {
String bookname = (String) book;
System.out.println("新书籍上线--> " + bookname + "<-- 已经同步到观察者 2 的位置");
}
}
- 测试代码
import com.ww.observermodel.BookList;
import com.ww.observermodel.Observer1;
import com.ww.observermodel.Observer2;
/**
* 测试类
* @author WW
*/
public class Test {
public static void main(String[] args) {
//被观察者
BookList observable = BookList.getBookList();
//观察者
Observer1 observer1 = new Observer1();
Observer2 observer2 = new Observer2();
//为被观察者注册观察者
observable.addObserver(observer1);
observable.addObserver(observer2);
//更新被观察者内容
observable.addBook("this is a new book");
}
}
- 测试结果
完成!!!!