您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 软件体系结构 观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。2.别名◦依赖(Dependents)◦发布-订阅(Publish-Subscribe)将一个系统分割成一系列相互协作的类有一个常见的副作用:◦需要维护相关对象间的一致性。◦我们不希望为了维持一致性而使各类紧密耦合,因为这样降低了它们的可重用性。一个表格对象和一个柱状图对象可使用不同的表示形式描述同一个应用数据对象的信息。表格对象和柱状图对象互相并不知道对方的存在,这样使你可以根据需要单独复用表格或柱状图。但在这里是它们表现的似乎互相知道。当用户改变表格中的信息时,柱状图能立即反映这一变化,反过来也是如此。这一行为意味着表格对象和棒状图对象都依赖于数据对象,因此数据对象的任何状态改变都应立即通知它们。同时也没有理由将依赖于该数据对象的对象的数目限定为两个,对相同的数据可以有任意数目的不同用户界面。Observer模式描述了如何建立这种关系。◦这一模式中的关键对象是目标(subject)和观察者(observer)。一个目标可以有任意数目的依赖它的观察者。一旦目标的状态发生改变,所有的观察者都得到通知。作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作(Collaboration)。观察者模式是满足这一要求的各种设计方案中最重要的一种。当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。Subject(目标)◦—目标知道它的观察者。可以有任意多个观察者观察同一个目标。◦—提供注册和删除观察者对象的接口。Observer(观察者)◦—为那些在目标发生改变时需获得通知的对象定义一个更新接口。ConcreteSubject(具体目标)◦—将有关状态存入各ConcreteObserver对象。◦—当它的状态发生改变时,向它的各个观察者发出通知。ConcreteObserver(具体观察者)◦—维护一个指向ConcreteSubject对象的引用。◦—存储有关状态,这些状态应与目标的状态保持一致。◦—实现Observer的更新接口以使自身状态与目标的状态保持一致。当ConcreteSubject发生任何可能导致其观察者与其本身状态不一致的改变时,它将通知它的各个观察者。在得到一个具体目标的改变通知后,ConcreteObserver对象可向目标对象查询信息。ConcreteObserver使用这些信息以使它的状态与目标对象的状态一致。1)目标和观察者间的抽象耦合2)支持广播通信3)意外的更新1)创建目标到其观察者之间的映射2)观察多个目标3)谁触发更新◦a)由目标对象的状态设定操作在改变目标对象的状态后自动调用Notify。◦b)让客户负责在适当的时候调用Notify。4)对已删除目标的悬挂引用5)在发出通知前确保目标的状态自身是一致的6)避免特定于观察者的更新协议—推/拉模型7)显式地指定感兴趣的改变8)封装复杂的更新语义◦ChangeManager有三个责任:◦a)它将一个目标映射到它的观察者并提供一个接口来维护这个映射。这就不需要由目标来维护对其观察者的引用,反之亦然。◦b)它定义一个特定的更新策略。◦c)根据一个目标的请求,它更新所有依赖于这个目标的观察者。9)结合目标类和观察者类abstractclassSubject{//FieldsprivateArrayListobservers=newArrayList();//MethodspublicvoidAttach(Observerobserver){observers.Add(observer);}publicvoidDetach(Observerobserver){observers.Remove(observer);}publicvoidNotify(){foreach(Observeroinobservers)o.Update();}}//ConcreteSubjectclassConcreteSubject:Subject{//FieldsprivatestringsubjectState;//PropertiespublicstringSubjectState{get{returnsubjectState;}set{subjectState=value;}}}//ObserverabstractclassObserver{//MethodsabstractpublicvoidUpdate();}//ConcreteObserverclassConcreteObserver:Observer{//Fieldsprivatestringname;privatestringobserverState;privateConcreteSubjectsubject;publicConcreteObserver(ConcreteSubjectsubject,stringname){this.subject=subject;this.name=name;}overridepublicvoidUpdate(){observerState=subject.SubjectState;Console.WriteLine(Observer{0}'snewstateis{1}“,name,observerState);}publicConcreteSubjectSubject{get{returnsubject;}set{subject=value;}}}publicclassClient{publicstaticvoidMain(string[]args){//ConfigureObserverstructureConcreteSubjects=newConcreteSubject();s.Attach(newConcreteObserver(s,1));s.Attach(newConcreteObserver(s,2));s.Attach(newConcreteObserver(s,3));//Changesubjectandnotifyobserverss.SubjectState=ABC;s.Notify();}}
本文标题:软件体系结构 观察者模式
链接地址:https://www.777doc.com/doc-3907215 .html