[lottery] 05_内容部分显示管理(三)——观察者设计模式

Android 4.0

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;
            }
        }
    }
}