设计模式之观察者模式

观察者模式无外乎两个操作,observer订阅自己关心的主题、主题有变化后通知订阅此主题的observers。
首先创建主题,主题中需要持有观察者列表的引用,用于在有状态或数据变化后通知到所有订阅此主题的观察者们。

public class Subject {
    private List<Observer> observers = new ArrayList<Observer>();
    private int state;
    public int getState(){
        return state;
    }

    public void setState(int state){
        this.state=state;
        
        notifyAllObservers();
    }

    public void attach(Observer observer){
        observers.add(observer);
    }

    private void notifyAllObservers() {
        for(Observer observer:observers){
            observer.update();
        }
    }
}

定义观察者接口

public abstract class Observer {
    protected Subject subject;
    public abstract void update();
}

接下来定义几个不同的观察者类

public class BinaryObserver extends Observer{

    public BinaryObserver(Subject subject){
        this.subject=subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        String result = Integer.toBinaryString(subject.getState());
        System.out.println("订阅的数据发生变化,新的数据处理为二进制值为:"+result);
    }
}
public class HexaObserver extends Observer{

    public HexaObserver(Subject subject){
        this.subject=subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        String result = Integer.toHexString(subject.getState()).toUpperCase();
        System.out.println("订阅的数据发生变化,新的数据处理为十六进制值为:"+result);
    }
}

client端调用

public class client {
    public static void main(String[] args){
        Subject subject = new Subject();

        new BinaryObserver(subject);
        new HexaObserver(subject);

        subject.setState(12);
    }
}

输出为
在这里插入图片描述

大家只要记住最核心的部分,一定有一个地方存放了所有的观察者,然后在事件发生的时候,遍历观察者,调用它们的回调函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值