android观察者设计模式 下载进度同步显示

观察者设计模式简介

观察者可以用来做什么?
比如应用商店下载进度条的问题

在列表中点击下载后,会显示进度状态:

android观察者设计模式 下载进度同步显示_第1张图片

当点击详情页面时,进度条会同步:
android观察者设计模式 下载进度同步显示_第2张图片

实现原理:

  • 利用观察者设计模式
  • 两个进度条分别为两个观察者,同时观察下载这个被观察者,当下载进度发生变化时,两个被观察者同时能够接收到变化的消息,下载进度得到了同步

如何实现?两种方法

  1. 实现系统接口
  2. 实现自定义接口

实现系统接口

步骤如下:

1. 被观察者实现Observable接口

public class DownManager extends Observable {
            //有内容发生改变
            @Override
            public boolean hasChanged() {
                return true;//true有内容发生改变,必须为true
            }

上面实现Observable方法后,必须实现hasChanged(),并且必须返回true.

2. 观察者实现Observer接口

        public class DetailView implements Observer {
            //当被观察者数据发生变化时,会调用该方法
            @Override
            public void update(Observable observable, Object data) {
                System.out.println("观察到变化了");
            }
        }

上面实现了Observer接口后,当被观察者发生变化时,观察者同步变化

3. 将被观察者与观察者联系起来

    public class MainActivity extends AppCompatActivity {

        private DownManager downManager;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //被观察者
            downManager = new DownManager();
            //当被观察者数据发生变化时,通知观察者
            downManager.addObserver(new DetailView());

        }

        public void click(View view){
            downManager.notifyObservers();//通知观察者数据发生了变化
        }
    }

上面的代码就是,通过addObserver将观察者添加到被观察者里面来,用户点击时,被观察者通过调用notifyObservers()方法通知观察者数据改变了

  1. 总结:就是,被观察者实现Observable接口,观察者实现Observer接口,被观察者将观察者加入自己里面来,当数据发生变化时,被观察者调用notifyObservers()方法,通知观察者数据发生了变化,此时观察者调用update()方法进行数据改变

一张图显示调用过程

android观察者设计模式 下载进度同步显示_第3张图片

二、实现自定义接口

上面代码实现有些局限性,就是我们继承了一个接口,就不能再继续继承其他接口了,所以我们需要自定义观察者设计模式

实现步骤如下:

1.自定义观察者:

    public class DownloadManager {
        //定义一个接口
        public interface Observer{
            public void update();//更新进度
            public void updateState();//更新状态

        }

        //创建一个集合
        List<Observer> observers = new ArrayList<Observer>();

        public void addObserver(Observer observer){
            if(observer==null){
                throw new RuntimeException();
            }
            if(!observers.contains(observer)){
                observers.add(observer);
            }
        }


        /** * 遍历集合中所有的Observer,调用所有update方法 * 通知数据发生变化 */
        public void notifyObservers(){
            for(Observer observer:observers){
                observer.update();
            }
        }

        /** * 更新状态发生了改变 */
        public void notifyState(){
            for(Observer observer:observers){
                observer.updateState();
            }
        }
    }

以上代码首先创建一个接口:接口里面的方法是观察者用来实现的

        public interface Observer{
            public void update();//更新进度
            public void updateState();//更新状态

        }

然后创建一个集合,用来存放接口的实现类:

    List<Observer> observers = new ArrayList<Observer>();

然后通过add方法来添加观察者,一个被观察者可以添加多个观察者:

    public void addObserver(Observer observer){
                if(observer==null){
                    throw new RuntimeException();
                }
                if(!observers.contains(observer)){
                    observers.add(observer);
                }
            }

最后notifyObservers()方法通知观察者调用方法:

        public void notifyObservers(){
            for(Observer observer:observers){
                observer.update();
            }
        }
        public void notifyState(){
            for(Observer observer:observers){
                observer.updateState();
            }
        }

此处的notifyObsevers()和notifyState(),接口定义了多少个方法,就可以定义多少notify方法来通知观察者

2.自定观察者

    public class DetailView implements DownloadManager.Observer {
        @Override
        public void update() {
            System.out.println("数据发生了变化");
        }

        @Override
        public void updateState() {
            System.out.println("状态发生了变化");
        }
    }

观察者实现自定义Observer接口,实现里面的方法,当收到消息后,做出相关操作

3. 总结

自定义接口和实现系统接口的原理相同,有点就是可以继承其他的类,可以自定义多个notify()方法

你可能感兴趣的:(设计模式,android)