观察者模式观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结手机消息推送Email网站假如不使用设计模式观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结假如不使用设计模式OlympicMobileUpdate(doubledata…)EmailUpdate(doubledata…)WebUpdate(doubledata…)观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结假如不使用设计模式OlympicMobileUpdate(doubledata)EmailUpdate(doubledata)ConsoleProgramUpdate(doubledata)publicclassMobile{publicvoidupdate(doubledata){//…}}publicclassEmail{publicvoidupdate(doubledata){//…}}publicclassWeb{publicvoidupdate(doubledata){//…}}classOlymplic{Mobilemobile;Emailemail;Webweb;publicvoidchanged(doubledata…){mobile.update(data);email.update(data);web.update(data);}}强依赖、紧耦合、不能抵御变化Olympic观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结依赖倒置原则/开闭原则WebUpdate(doubledata)EmailUpdate(doubledata)MobileUpdate(doubledata)《interface》Update(doubledata)《abstractclass》一多变化通知更新观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结报社出版报纸读者订阅报纸报社为订户发送报纸读者取消订阅出版者主题Subject订阅者观察者Observer观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结报纸消息与订阅者读者1读者3读者2神舟十一号许多观察者读者4要注册(订阅)主题对象观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结报纸消息与订阅者读者1读者3读者2神舟十一号主题对象许多观察者读者4观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结读者1读者3读者2神舟十一号许多观察者读者4主题对象报纸消息与订阅者观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结读者1读者3读者2神舟十一号许多观察者读者4要删除(取消订阅)主题对象报纸消息与订阅者观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结报纸消息与订阅者读者1读者3读者2神舟十一号许多观察者读者4主题对象观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结报纸消息与订阅者读者1读者3读者2神舟十一成功许多观察者读者4主题对象观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结观察者的一天读者1读者2报纸消息许多观察者读者4主题对象ConcreteSubjectConcreteObserverObserverUpdate()ConcreteObserverConcreteObserverregisterObserver()notifyObserver()removeObserver()SubjectlistIObserverregisterObserver(IObeserver)notifyObservers()removeObserver(IObeserver)观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结SubjectlistIObserverregisterObserver(IObeserver)notifyObservers()removeObserver(IObeserver)IObserverUpdate(doubledata)观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结WebUpdate(doubledata)EmailUpdate(doubledata)MobileUpdate(doubledata)OlympicIObserverUpdate(doubledata)SubjectlistIObserverregisterObserver(IObeserver)notifyObservers()removeObserver(IObeserver)OlympicSubjectlistIObserverregisterObserver(IObeserver)notifyObservers()removeObserver(IObeserver)观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结WebUpdate(doubledata)EmailUpdate(doubledata)MobileUpdate(doubledata)IObserverUpdate(doubledata)publicabstractclassSubject{publicListIObserverobservers=newListIObserver();publicvoidregisterObserver(IObserverobserver){observers.Add(observer);}virtualpublicvoidnotifyObservers(doubledata){foreach(IObserverobserverinobservers){observer.update(data);}}publicvoidremoveObserver(IObserverobserver){observers.Remove(observer);}}publicclassOlympicimplementsSubject{…publicvoidchanged(doubledata){notifyObservers(data);}}观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结实质发布者与订阅者的一对多依赖关系发布者改变时,自动通知订阅者进行更新效果主题和观察者之间的松耦合,使得二者可以被独立改变主题变化将自动广播通知,不关心具体观察者观察者模式项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结ConcreteobserverUpdate(doubledata)SubjectlistIObserverregisterObserver()notifyObservers()removeObserver()ConcreteSubjectIObserverUpdate(doubledata)练习:一个春游计划春游计划(SpringTourPlan)管理系统需要发布春游信息,维护报名者(Participant)集合;感兴趣的人可以报名参加;需要向所有的报名者发布(notify)有关春游计划的信息;每一个报名者收到信息后,将会以自己的方式到达(update)集合地点。项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结Planinterface+registerParticipant(parti:Participant)+removeParticipant(parti:Participant)+notifyAll()Participantinterface+update()SpringTourPlan0..*MemberAMemberB项目背景认识观察者模式使用观察者设计项目使用观察者实现项目总结练习:一个春游计划