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

温故知新

首先我们定义两个接口:一个是观察者有一个方法 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("我开始偷东西了");


    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
观察者模式是一种常见的设计模式,它的主要思想是在对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 在Java中,观察者模式实现需要定义两个角色:Subject(主题)和Observer(观察者)。Subject负责维护一组观察者对象,以及通知它们状态的变化;而Observer则负责接收Subject的通知,并做出相应的处理。 下面是一个简单Java实现: ```java import java.util.ArrayList; import java.util.List; // 主题接口 interface Subject { void attach(Observer observer); // 添加观察者 void detach(Observer observer); // 移除观察者 void notifyObservers(); // 通知所有观察者 } // 观察者接口 interface Observer { void update(); // 更新状态 } // 具体主题类 class ConcreteSubject implements Subject { private List<Observer> observers = new ArrayList<>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } // 主题状态的变化 public void changeState() { // do something notifyObservers(); // 通知所有观察者 } } // 具体观察者类 class ConcreteObserver implements Observer { private String name; public ConcreteObserver(String name) { this.name = name; } public void update() { System.out.println(name + " has received the update."); } } // 测试 public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new ConcreteSubject(); Observer observer1 = new ConcreteObserver("Observer1"); Observer observer2 = new ConcreteObserver("Observer2"); Observer observer3 = new ConcreteObserver("Observer3"); subject.attach(observer1); subject.attach(observer2); subject.attach(observer3); ((ConcreteSubject) subject).changeState(); subject.detach(observer2); ((ConcreteSubject) subject).changeState(); } } ``` 在这个例子中,我们定义了Subject和Observer两个接口,以及它们的具体实现类ConcreteSubject和ConcreteObserver。其中ConcreteSubject负责维护一组观察者对象,并在状态变化时通知它们;而ConcreteObserver则负责接收Subject的通知,并做出相应的处理。 在测试代码中,我们创建了一个ConcreteSubject对象,并向它添加了三个ConcreteObserver观察者。然后我们调用changeState()方法改变主题的状态,这会触发ConcreteSubject通知所有观察者。最后我们移除了一个观察者,并再次调用changeState()方法,这时只有两个观察者会收到通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值