Java实现观察者模式

文章介绍了观察者模式的概念,即当被观察者状态改变时,观察者能接收到通知并作出响应。通过代码示例展示了如何实现被观察者和观察者,提到了潜在的性能问题(当观察者数量增加时)。文章建议通过异步处理来改善性能,并强调设计独立的观察者以避免循环依赖。同时指出被观察者无法了解观察者的状态,这可能需要额外的设计考虑。
摘要由CSDN通过智能技术生成

简简单单,今天来个观察者模式

什么叫观察者模式;就是一个对象subject,即被观察者,当它的状态发生改变的时候,它的观察者们能够立马收到通知(收到通知后根据实际场景做出相应的动作)

实现思路也比较简单,对于被观察者subject,它维护一个观察者list,当状态改变,通知到list上的观察者即可;对于观察者,把自己添加到观察者list即可。

被观察者实现
public class Subject {

    List<Observer> observers = new ArrayList<>();

    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        System.out.println("subject update.");
        notifyAllObservers();
    }

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

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

    public static void main(String[] args) {
        Subject subject = new Subject();
        new MyObserver(subject);
        subject.setState(1);
    }
}
被观察者抽象类
public abstract class Observer {
    protected Subject subject;
    
    public Observer(Subject subject) {
        this.subject = subject;
        subject.attach(this);

    }
    protected abstract void update();
}
观察者实现
public class MyObserver extends Observer {
    public MyObserver(Subject subject) {
        super(subject);
    }

    @Override
    protected void update() {
        System.out.println("MyObserver get subject's state and update itself, subject's state = " + subject.getState());
    }
}

简简单单,明明白白

总结

网上都说观察者和被观察者抽象耦合,这是一个优点,我不是很理解,大概意思就是他们之间是同过一些接口耦合在一起的,具体的逻辑实现是分开的?就是我们是分开写观察者和被观察者的逻辑,二者没有直接的交互?我瞎理解的。

缺点的话,我们看到是一个for循环通知被观察者,如果观察者多了,明显的性能问题,怎么改?简单,上异步啊,每个观察者之间是独立的,直接异步提速!如果你的烂观察者之间存在循环依赖,一个调用,烂了啊!

所以,要避免这些缺点,最好是能够设计出,彼此独立的观察者们!

还有一个不算缺点的缺点,被观察者是不知道观察者的状态的,如果你有这方面的需求,可能还要引入其他方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值