最简单的观察者模式纯JAVA实现

2023-02-07 17:49:17

温故知新

首先我们定义两个接口:一个是观察者有一个方法 updata();接收被观察者改变后发送过来的消息,另一个是观察者 有三个方法

添加观察者1、addWather(Watcher watcher)
删除观察者2、 removeWather(Watcher wather)
给观察者发送消息3、notify(String str)

观察者接口:

package Interface;

/**
 * 观察者接口
 * @author hu
 *
 */
public interface Watcher {

    public void updata(String str);
}

被观察者接口:

package Interface;

/**
 * 被观察者接口
 * @author hu
 *
 */
public interface Watchered {

    public void addWatcher(Watcher watcher);
    public void removeWatcher(Watcher watcher);
    public void notifyWatcher(String str);
}

观察者类:

package founction;

import Interface.Watcher;

public class CreaterWatcher implements Watcher {

    //这个方法其实是供 被 被观察者 形参 CreateWather调用  到后来 还会回调当前这个方法
    @Override
    public void updata(String str) { //接收被监听者发过来的消息
        System.out.println(str);
    }

}

被观察者类:

package founction;

import java.util.ArrayList;
import java.util.List;

import Interface.Watcher;
import Interface.Watchered;

/**
 * 被观察者的类
 * @author hu
 *
 */
public class CreaterWatchered implements Watchered {

    //定义一个集合存储 观察者  这里的泛型类型我们使用接口 父引用指向子类
    List<Watcher> list = new ArrayList<>();


    @Override
    public void addWatcher(Watcher watcher) {

        list.add(watcher);
    }

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

    @Override
    public void notifyWatcher(String str) {

        //通过这个方法通知观察者  我要偷东西了
            //通过循环通知每位观察者  for循环  都可以的

        /**
         * 方法1: 迭代器循环
         */
        /*Iterator<Watcher> it = list.iterator();
        while(it.hasNext()){

            CreaterWatcher watcher = (CreaterWatcher) it.next();
            watcher.updata(str);
        }*/


        /**
         * 方法2:增强for
         */

        /*for (Watcher watcher : list) {

            watcher.updata(str);
        }*/

        /**
         * 方法3:普通for循环
         */
        for (int i = 0; i < list.size(); i++) {

            list.get(i).updata(str);
        }
    }

}

测试类:

package Test;

import founction.CreaterWatcher;
import founction.CreaterWatchered;
/**
 * 测试类
 * @author hu
 *
 */
public class TestRxjava {

    public static void main(String[] args) {

        //创建观察者

        CreaterWatcher watcher1 = new CreaterWatcher();
        CreaterWatcher watcher2 = new CreaterWatcher();
        CreaterWatcher watcher3 = new CreaterWatcher();
        CreaterWatcher watcher4 = new CreaterWatcher();
        //创建被观察者

        CreaterWatchered watchered = new CreaterWatchered();
        watchered.addWatcher(watcher1);
        watchered.addWatcher(watcher2);
        watchered.addWatcher(watcher3);
        watchered.addWatcher(watcher4);

        //被观察者开始 发消息了  也就像 小偷开始偷东西了,警察(观察者)一直在监视者  这个时候警察 就是接收到消息了
        watchered.notifyWatcher("我开始偷东西了");


    }

}
  • 作者:雨人来
  • 原文链接:https://blog.csdn.net/Hu_wenpeng/article/details/52988822
    更新时间:2023-02-07 17:49:17