小白十七篇 观察者模式

观察者模式 Observer Model

观察者模式也就是发布订阅模式,是一种对象的行为模式,也是一种一对多的依赖关系,即可以让多个观察者同时监视一个被观察者的状态变化,当被观察者的状态发生改变,此时被观察者将通知所有观察者自身已经发生了改变时观察者和被观察者同步。
PS:一对多的关系就是一个被观察者可以对应多个观察者。
观察则模式用例图

观察者模式案例实现

java中
被观察者需要继承java.util.Observable类
观察者需要实现java.util.Observer接口并实现update方法
  1. 被观察者的实现代码
    构造方法私有化(使用单例模式)
    定义可以增加观察者的方法
    最重要的方法是改变自身状态的方法也就是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);
	}
}
  1. 观察者的实现代码,此案例以两个观察者为例,两者代码大致相同
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 的位置");
	}
}
  1. 测试代码
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");
	}
}
  1. 测试结果
    结果图
    完成!!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值