Rx_java(1) 观察者模式实例讲解

相关文章

  • 使用java中的类(Observable与Observer)实现观察者模式
  • Rx_java2的基本使用
  • Rx_java2中的线程控制
  • Rx_java2操作符介绍1(Map、Flatmap)
  • Rx_java2操作符介绍2(debounce 、filter 、switchMap )
  • Rx_java2操作符介绍3(throttleFirst、debounce )
  • Retrofit结合RxJava2使用

写在前面

  • 通常我们的代码设计思想都是来源于生活,如面向对象的设计思想,观察者模式等均来源现实生活。在我们正常接触到的代码中,回调接口、回调函数、回调参数、监听器模式,这些也是观察者模式。

  • 观察者模式(Observer)将观察者和被观察的对象分离开。拿观察者模式呢举个例子,我们界面是一个观察者,而界面上面显示的数据是被观察者,如果我们的数据一旦发生变化,我们的界面马上把这些变化后的数据显示出来。

  • 面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
    观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。 —百度百科

观察着模式的代码体现

首先,我们创建一个观察者的接口Watcher

在里面创建一个方法update(String str),当被观察者的数据发生变化后,回调此方法,所以,这个方法中需要完成当被观察者数据变化后的业务逻辑。

/**
 * description:
 * author: dujun
 * created at: 2017/12/28 17:31
 * update: 2017/12/28
 * version:
 */
public interface Watcher {
    void update(String str);   // 当被观察者数据发生变化后,回调此方法
}

然后,我们创建被观察者的接口Watched

在里面创建三个抽象方法 ,其实现类将实现此三个抽象方法的业务逻辑
1.void addWatcher(Watcher watcher); 此方法是给次被观察者添加观察者
2.void removeWatcher(Watcher watcher);此方法是移除添加进来的观察者
3.void notifyWaters(String str);此方法是通知被添加进来的所有观察者数据发生了变化

/**
 * description:
 * author: dujun
 * created at: 2017/12/29 9:21
 * update: 2017/12/29
 * version:
 */
public interface Watched {
    // 添加观察者
    void addWatcher(Watcher watcher); 
    // 移除观察者
    void removeWatcher(Watcher watcher);
    // 通知被添加进来的所有观察者数据发生了变化
    void notifyWaters(String str);
}

然后我们来完成被观察者实现类WatcheredImpl

在被观察者里面创建一个List集合,来存储被添加进来的观察者Watcher.
在notifyWaters()方法中,回调所有观察者update方法,来通知观察着数据发生了变花变化。

/**
 * description:
 * author: dujun
 * created at: 2017/12/29 9:33
 * update: 2017/12/29
 * version:
 */
public class WatcheredImpl implements Watched {
    private List list = new ArrayList<>();
    @Override
    public void addWatcher(Watcher watcher) {
        list.add(watcher);
    }

    @Override
    public void removeWatcher(Watcher watcher) {
        list.remove(watcher);
    }

    @Override
    public void notifyWaters(String str) {
        for (Watcher watcher : list) {
            watcher.update(str);
        }
    }
}

接着来完成观察者实现类WatcherImpl

实现 update(String str)方法,在此方法中完成被观察者数据变化后的业务逻辑,
此处,我的逻辑很简单,就是当被观察者数据发生变化后,在控制台输出一个字符串。

/**
 * description:
 * author: dujun
 * created at: 2017/12/29 9:38
 * update: 2017/12/29
 * version:
 */
public class WatcherImpl implements Watcher {
    @Override
    public void update(String str) {
        // 在此完成被观察者数据变化后的业务逻辑
        System.out.println(str);
    }
}

最后我们来测试的我们上面完成的观察者模式

编写测试类Test,测试类中,所有步骤的注释都写的很详细了,我这里就不再啰嗦。

/**
 * description:
 * author: dujun
 * created at: 2017/12/29 9:41 
 * update: 2017/12/29
 * version: 
 */
public class Test {
    public static void main(String [] args) throws Exception{
        // 创建一个被观察者
        WatcheredImpl watchered = new WatcheredImpl();

        // 创建三个观察者的实例对象
        WatcherImpl watcher1 = new WatcherImpl();
        WatcherImpl watcher2 = new WatcherImpl();
        WatcherImpl watcher3 = new WatcherImpl();

        // 将三个观察者添加到被观察者中
        watchered.addWatcher(watcher1);
        watchered.addWatcher(watcher2);
        watchered.addWatcher(watcher3);

        // 被观察者数据发生变化,通知观察者
        watchered.notifyWaters("被观察者数据发生了变化");
    }
}

结果展示

运行测试类Test,
Rx_java(1) 观察者模式实例讲解_第1张图片
三个观察着都接受到了观察者数据的变化,并作出了响应。

写在后面

以上就是观察者模式的初步体验,更加详细的介绍,将在后面的文章中介绍。请看Rx_java系列二-使用java中的类(Observable与Observer)实现观察者模式

你可能感兴趣的:(Rx-java)