《震惊!Java 观察者模式竟如此强大》

103 阅读2分钟

宝子们,今天来扒一扒 Java 中超级实用的观察者模式,学会它,代码直接起飞!

一、观察者模式是啥?

简单来讲,观察者模式就像是一场明星与粉丝的大型互动现场。有一个被观察的对象(明星),当它的状态发生变化时,那些关注它的对象(粉丝)会收到通知并做出反应。

这里面有两个重要角色:

  • 主题(Subject) :也就是被观察的对象,它管理着观察者列表,并且负责在状态改变时通知这些观察者,是这场互动的主角。
  • 观察者(Observer) :时刻关注着主题的状态变化,一旦收到通知,就会执行相应的方法,它们是这场互动的忠实粉丝群体。

二、使用场景

  1. 社交媒体动态提醒:当你在微博上关注的博主(主题)发布了一条新动态,你作为观察者就会收到推送通知,然后你可以去点赞、评论或者转发,是不是很熟悉?这背后就是观察者模式在默默运作,确保你不错过任何精彩内容。
  1. 股票价格变化:在股票市场中,股民们(观察者)关注着某些股票(主题)的价格走势。一旦股票价格发生变化,股民们会立即收到通知,以便决定是买入、卖出还是继续持有,这可是真金白银的事儿,观察者模式在这就起到了关键作用。

三、代码示例登场

import java.util.ArrayList;
import java.util.List;
// 观察者接口
interface Observer {
    void update(String message);
}
// 具体观察者类:粉丝 A
class FanA implements Observer {
    @Override
    public void update(String message) {
        System.out.println("粉丝 A:收到消息 - " + message);
    }
}
// 具体观察者类:粉丝 B
class FanB implements Observer {
    @Override
    public void update(String message) {
        System.out.println("粉丝 B:哇哦," + message);
    }
}
// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String message);
}
// 具体主题类:明星
class Celebrity implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String latestNews;
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
    public void setLatestNews(String latestNews) {
        this.latestNews = latestNews;
        notifyObservers(latestNews);
    }
}
// 测试代码
public class ObserverPatternDemo {
    public static void main(String[] args) {
        Celebrity celebrity = new Celebrity();
        FanA fanA = new FanA();
        FanB fanB = new FanB();
        celebrity.registerObserver(fanA);
        celebrity.registerObserver(fanB);
        celebrity.setLatestNews("我要开演唱会啦!");
        celebrity.removeObserver(fanA);
        celebrity.setLatestNews("新专辑即将发布!");
    }
}

宝子们,观察者模式是不是很有趣又很实用呢?赶紧在你的代码里运用起来,让你的程序也能像社交媒体和股票市场一样灵活运转!