本文最后更新于 2025年7月27日 下午
观察者模式定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新
角色
- 抽象观察者角色 : 为所有的具体观察者定义一个接口,在得到主题通知时更新自己
- 具体观察者角色 : 实现抽象观察者角色所需要的更新接口,以便使本身的状态与主题的状态相协调
- 抽象被观察者角色 :一个抽象主题,把所有对观察者对象的引用保存在一个集合中,每个主题可以有任意数量的观察者。
- 具体被观察者角色 :一个具体主题,在具体主题的内部状态改变时,向所有登记过的观察者发出通知。
实现观察者模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| public interface NewsObserver{ void update(String msg); }
public class BBCNews implements NewsObserver{ @Override public void update(String msg){ System.out.println(msg); } }
public class ABCNews implements NewsObserver{ @Override public void update(String msg){ System.out.println(msg); } }
public interface NewsObject { void addObserver(NewsObserver newsObserver); void removeObserver(NewsObserver newsObserver); void notify(String msg); }
public class News implements NewsObject{ private List<NewsObserver>newsObservers = new ArrayList<>();
@Override public void addObserver(NewsObserver newsObserver){ newsObservers.add(newsObserver); } @Override public void removeObserver(NewsObserver newsObserver){ newsObservers.remove(newsObserver); }
@Override public void notify(String msg){ for(NewsObserver newsObserver:newsObservers){ newsObserver.update(msg); } } }
public class Test { public static void main(String[] args){ NewsObject news = new News(); NewsObserver bbc = new BBCNews(); NewsObserver abc = new ABCNews(); news.addObserver(bbc); news.addObserver(abc); news.notify("break news !");
} }
|
总结
观察者模式是一种 行为型设计模式 ,用于建立 一对多的对象依赖关系 。当一个对象的状态发生变化时,它能够 自动通知并更新所有依赖于它的对象 ,而无需主动调用。这种模式实现了 对象间的松耦合 ,在实际系统中常用于事件监听、数据推送、UI刷新的通知机制等场景。通过该模式, 被观察者与观察者之间只通过抽象接口联系,避免了直接依赖,提高了系统的可扩展性与可维护性 。