观察者模式

(一)理解观察者模式

像是订阅号一样,当发布者(主题)发布新消息的时候,所有订阅的用户(观察者)都会接收到新消息。当取消订阅(撤销)之后,发布者更新消息不会影响,反之想要接收消息需要先订阅(注册主题)
*另外java自带了一套封装好的观察者模式此篇文章只是帮助理解

(二)主要组成

- Subject接口:主题接口,主要方法有registerObserver(注册观察者)、removeObserver(撤销观察者)、notifyObserver(当数据发生变化时用于通知观察者)
- Subject实现类:具体的主题,数据源。就像微信订阅的公众号,报社
- Observer接口:至少一个update方法(当主题数据发生变化调用此方法)
- Observer实现类:具体的观察者

(三)代码部分

主题代码
/**
 * @author zzz
 * @date 2020/3/12 14:41
 */
//主题接口,所有具体主题必须实现
//用于观察者注册,注销,当数据发生变化通知所有/部分观察者
interface Subject {
    //注册观察者
    public void registerObserver(Observer o);
    //撤销观察者
    public void removeObserver(Observer o);
    //通知观察者
    public void notifyObserver();
}
//具体主题类
class newsPaperOffice implements Subject{
    public ArrayList<Observer> observers = new ArrayList<>();
    public newsPaperOffice(){};

    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        int i = observers.indexOf(o);
        if (i > -1){
            observers.remove(i);
        }
    }

    @Override
    public void notifyObserver() {
        for (Observer observer : observers) {
            observer.update();
        }
    }

    public void provide(){
        notifyObserver();
    }
}
观察者代码
/**
 * @author zzz
 * @date 2020/3/12 14:53
 * 观察者接口所有观察者实现此接口
 */
interface Observer {
    public void update();
}
//A号 观察者
class personA implements Observer{
    @Override
    public void update() {
        System.out.println("AAA 我收到最新新闻");
    }
}
//B号 观察者
class personB implements Observer{
    @Override
    public void update() {
        System.out.println("BBB 我收到最新新闻");
    }
}
//C号 观察者
class personC implements Observer{
    @Override
    public void update() {
        System.out.println("CCC 我收到最新新闻");
    }
}
测试代码
/**
 * @author zzz
 * @date 2020/3/12 15:19
 *想要接受通知必须要先进行注册registerObserver()
 */
public class test {
    public static void main(String[] args) {
        newsPaperOffice newsPaperOffice = new newsPaperOffice();
        //创建3个 观察者
        Observer observerA = new personA();
        Observer observerB = new personB();
        Observer observerC = new personC();
        //注册观察者
        newsPaperOffice.registerObserver(observerA);
        newsPaperOffice.registerObserver(observerB);
        newsPaperOffice.registerObserver(observerC);

        newsPaperOffice.provide();

        //取消一个观察者
        newsPaperOffice.removeObserver(observerA);

        newsPaperOffice.provide();
    }
}
执行结果
AAA 我收到最新新闻
BBB 我收到最新新闻
CCC 我收到最新新闻
BBB 我收到最新新闻
CCC 我收到最新新闻
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值