1、java.util.Observable类:被观察的类继承
①通过setChanged(),将标记设置为true,
②调用notifyObservers()
③notifyObservers(object);传递数据给观察者
2、java.util.Observer接口
:观察被观察类的变化,实现Observer接口
①当被观察者调用notifyObservers()或者notifyObservers(object)时
②会被观察者update(Observable observable, Object data)给接收到,其中参数二,就是被观察者传递过来的数据
l
观察者的实现
一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象。一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。
设计实现:
一、观察者:Observer.java
update()方法
二、被观察者:Observable.java
1、用一个布尔型变量boolean isChange=false变量记住;
2、用一个集合List<Observer> obsevers列举所有的观察者;
3、if(isChange) //如果为真 --setChanged()
notifyObservers()//那么通知观察者变换 --notifyObservers()
{
for(obsevers)//循环变量其所有的观察者
{
item.update();//进行update()
}
}
当前UI模式存在问题
1、当前的UiManager主要用于管理内容部分展示,但是当曾加界面时不得不修改UiManager 中的代码。
2、如果增加一个需要同主要内容联动的容器,那么我们需要改动的地方很多,原因是代码的依赖关系过于紧密。
解决方案:
引入观察者设计模式
步骤:
1、UiManager继承java.util.Observable类
2、Top和Bottom的Manager实现java.util.Observer接口
3、Activity初始化时添加观察者
1、 UIManager继承 java.util.Observable类
2、在TopTitleManager和 BottomNavigatorManager中实现 Observer接口
3、并实现update方法
@Override
public void update(Observable observable, Object data) {
}4、为UIManager添加了两个观察者
UIManager.getUiManager().addObserver(titleManager);
UIManager.getUiManager().addObserver(bottomNavigatorManager);5、在UIManager中,数据变化的时候,通知观察者数据变化了
setChanged();// 设置为true
// notifyObservers();//通知自己的观察者,数据变化了,但这个不能传递数据
notifyObservers(currentBaseView.getViewId()); 6、分别在TopTitleManager和BottomNavigatorManager的update方法中做相应的代码实现
①TopTitleManager:
// 10、监听UIManager中内容的变化
@Override
public void update(Observable observable, Object data) {
if (data!=null) {
if (StringUtils.isNumeric(data.toString())) {
int viewId = Integer.parseInt(data.toString());
switch (viewId) {
case ConstantValue.VIEW_FIRSTVIEW:
showUnLoginTitle();
break;
case ConstantValue.VIEW_SECONDVIEW:
showCommonTitle();
break;
}
}
}
} ②BottomNavigatorManager:
// 6、监听UIManager中内容的变化
@Override
public void update(Observable observable, Object data) {
if (data != null) {
if (StringUtils.isNumeric(data.toString())) {
int viewId = Integer.parseInt(data.toString());
switch (viewId) {
case ConstantValue.VIEW_FIRSTVIEW:
showCommonBottom();
break;
case ConstantValue.VIEW_SECONDVIEW:
showGameBottom();
break;
}
}
}
}