观察者模式也称为“发布-订阅模式”,所以它的对象之间的角色是发布和订阅。定义对象之间的一对多依赖关系。当一个对象的状态发生变化时,依赖它的对象会收到通知并自动更新。抽象主题(Subject)角色:也叫抽象目标类,它提供了一个保存观察者对象的聚合类和增删观察者对象的方法,以及一个通知所有观察者的抽象方法。具体主体角色:也叫具体目标类,实现了抽象目标中的通知方法,当具体主体内部状态发生变化时,通知所有注册的观察者对象。抽象观察者(Observer)角色:是一个抽象类或接口,包含一个更新自身的抽象方法,当收到特定主题的变化通知时调用。ConcreteObserver角色:实现AbstractObserver中定义的抽象方法,以在收到目标更改通知时更新自己的状态。抽象主题——天气预报publicabstractclassWeather{Mapmap=newHashMap<>();publicvoidaddWebSite(Stringname,WebSitewebSite){map.put(name,webSite);}publicvoidremoveWebsite(Stringname){map.remove(name);}publicabstractvoidpublishMessage(Stringmessage);}具体主题——北京天气publicclassBeijingWeatherextendsWeather{@OverridepublicvoidpublishMessage(Stringmessage){Iteratoriterator=map.values().iterator();while(iterator.hasNext()){iterator.next().postWeather(消息);}}}AbstractObserver-WebsitepublicinterfaceWebSite{voidpostWeather(Stringmessage);}ConcreteObserver-Sina,YahoopublicclassSinaimplementsWebSite{@OverridepublicvoidpostWeather(Stringmessage){System.out.println("新浪天气:"+message);}}publicclassYahooimplementsWebSite{@OverridepublicvoidpostWeather(Stringmessage){System.出去。println("雅虎天气:"+message);}}testpublicclassObserverTest{@Testpublicvoidtest(){Weatherweather=newBeijingWeather();weather.addWebSite("新浪",新新浪());天气。添加网站(“雅虎”,新雅虎());weather.publishMessage("北京多云,23℃");}}======结果======雅虎天气:北京多云,23℃新浪天气:北京多云,23℃