观察者模式
基本介绍
定义
观察者模式定义对象之间一对多的关系,当一个对象的状态发生改变时,能够自动通知与其关联的对象,该对象并刷新自己的状态。
类图
例子
下面以上网的例子实现观察者模式
首先创建一个名为Observer的工程,创建InternetBarService观察的接口,代码如下:
public interface InternetBarService {
void onRecharge(int money);
}
创建一个Person类并实现InternetBarService的接口,代码如下:
public class Person implements InternetBarService{
private String name;
public Person(String name) {
this.name = name;
}
@Override
public void onRecharge(int money) {
System.out.println(name + " 充值" + money + "元成功");
}
}
创建一个名为InternetBarManager收银员类,代码如下:
public class InternetBarManager {
private InternetBarService mListener;
public void registerObserver(InternetBarService listner) {
mListener = listner;
}
public void unregisterObserver() {
mListener = null;
}
public void recharge(int money) {
if (mListener != null) {
mListener.onRecharge(money);
}
}
}
最后实现客户端的调用,代码如下:
public class Main {
public static void main(String[] args) {
//初始化网吧管理对象
InternetBarManager manager = new InternetBarManager();
//新建一个person对象
Person person = new Person("dylan");
System.out.println("dylan 进行上机操作");
manager.registerObserver(person);
//充值
manager.recharge(5);
System.out.println("dylan 进行下机操作");
manager.unregisterObserver();
}
}
运行代码结果如下:
dylan 进行上机操作
dylan 充值5元成功
dylan 进行下机操作
利用java内置的观察者模式实现以上代码
创建InternetBarManager类并继承Observable,代码如下:
package com.dylan.java.inner;
import java.util.Observable;
public class InternetBarManager extends Observable{
private int money;
public void recharge(int money) {
this.money = money;
//设置状态改变
setChanged();
//通知其他对象
notifyObservers();
}
public int getMoney() {
return money;
}
}
创建Person类并实现Observer接口,代码如下:
package com.dylan.java.inner;
import java.util.Observable;
import java.util.Observer;
public class Person implements Observer {
private String name;
public Person(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
if (o instanceof InternetBarManager) {
InternetBarManager manager = (InternetBarManager)o;
System.out.println(name + " 充值" + manager.getMoney() + "元成功");
}
}
}
客户端的代码如下:
package com.dylan.java.inner;
public class Main {
public static void main(String[] args) {
InternetBarManager manager = new InternetBarManager();
Person person = new Person("dylan");
System.out.println("dylan 进行上机操作");
manager.addObserver(person);
System.out.println("此时观察列表大小为:"+manager.countObservers());
manager.recharge(5);
System.out.println("dylan 进行下机操作");
manager.deleteObserver(person);
System.out.println("此时观察列表大小为:"+manager.countObservers());
}
}
运行代码,结果如下:
dylan 进行上机操作
此时观察列表大小为:1
dylan 充值5元成功
dylan 进行下机操作
此时观察列表大小为:0