14-设计模式教学课件_第1页
14-设计模式教学课件_第2页
14-设计模式教学课件_第3页
14-设计模式教学课件_第4页
14-设计模式教学课件_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、观察者(Observer)模式 课本例子办公时间做与工作无关的事情在老板到来时,前台负责通知好友进入工作状态注意开放-封闭原则,依赖倒转原则,降低耦合性。通知者接口interface Subject void Attach(Observer observer); void Detach(Observer observer); void Notify(); string SubjectState get; set; class Secretary : Subject /同事列表 private IList observers = new List(); private string action

2、; /增加 public void Attach(Observer observer) observers.Add(observer); /减少 public void Detach(Observer observer) observers.Remove(observer); /通知 public void Notify() foreach (Observer o in observers) o.Update(); /前台状态 public string SubjectState get return action; set action = value; 抽象观察者abstract clas

3、s Observer protected string name; protected Subject sub; public Observer(string name, Subject sub) = name; this.sub = sub; public abstract void Update(); 看股票的同事class StockObserver : Observer public StockObserver(string name, Subject sub) : base(name, sub) public override void Update() Cons

4、ole.WriteLine(0 1 关闭股票行情,继续工作!, sub.SubjectState, name); 看NBA的同事 class NBAObserver : Observer public NBAObserver(string name, Subject sub) : base(name, sub) public override void Update() Console.WriteLine(0 1 关闭NBA直播,继续工作!, sub.SubjectState, name); 客户端class Program static void Main(string args) Secr

5、etary tongzizhe = new Secretary(); StockObserver tongshi1 = new StockObserver(魏关姹, tongzizhe); NBAObserver tongshi2 = new NBAObserver(易管查, tongzizhe); tongzizhe.Attach(tongshi1); tongzizhe.Attach(tongshi2); tongzizhe.SecretaryState = 老板回来了!; tongzizhe.Notify(); Console.Read(); 观察者模式又叫做:发布-订阅(Publish

6、/Subscribe)模式模型-视图(Model/View)模式源-监听器(Source/Listener)模式从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。做到这一点的设计方案有很多,但是为了使系统能够易于复用,应该选择低耦合度的设计方案。减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作(Colla

7、boration)。观察者模式是满足这一要求的各种设计方案中最重要的一种。观察者模式的结构 抽象主题(Subject)角色:一个目标可以被多个观察者观察目标提供对观察者注册和退订的维护当目标的状态发生变化时,目标负责通知所有注册的、有效地观察者抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。抽象观察者角色一般用一个抽象类或者一个接口实现。在这个示意性的实现中,更新接口只包含一个方法(即Update()方法),这个方法叫做更新方法。 具体主题(ConcreteSubject)角色:将有关状态存入具体现察者对象;在具体主题的内部

8、状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色(Concrete Observable)。具体主题角色通常用一个具体子类实现。 具体观察者(ConcreteObserver)角色:具体现察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体现察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。 认识观察者模式目标和观察者之间的关系典型的一对多的关系单向依赖观察者依赖于目标触发通知的时机完成了状态维护后触发相互观察A、B观察C,B、C观察A(两套观察模式)注意死循环通知的顺序绝对不要依赖于通知的顺

9、序,多个观察者之间的功能是平行的,相互不应该有先后的依赖关系观察者模式的效果有以下几个优点:观察者模式实现了观察者和目标之间的抽象耦合。观察者模式实现了动态联动观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。 缺点可能会引起无谓的操作。由于采用广播方式,不管观察者需不需要,每个观察者都会被调用update方法本质触发联动一个实际应用观察者模式的例子 该例子演示了注册的投资者在股票市场发生变化时,可以自动得到通知 /SubjectabstractclassStock/Fieldsprotectedstringsymbol;protecteddoubleprice;private

10、ArrayListinvestors=newArrayList();/ConstructorpublicStock(stringsymbol,doubleprice)this.symbol=symbol;this.price=price;/MethodspublicvoidAttach(Investorinvestor)investors.Add(investor);publicvoidDetach(Investorinvestor)investors.Remove(investor);publicvoidNotify()foreach(Investoriininvestors)i.Updat

11、e(this);/PropertiespublicdoublePricegetreturnprice;setprice=value;Notify(); publicstringSymbolgetreturnsymbol;setsymbol=value;/ConcreteSubjectclassIBM:Stock/ConstructorpublicIBM(stringsymbol,doubleprice):base(symbol,price)/ObserverinterfaceIInvestor/MethodsvoidUpdate(Stockstock); /ConcreteObservercl

12、assInvestor:IInvestor/Fieldsprivatestringname;privatestringobserverState;privateStockstock;/ConstructorspublicInvestor(stringname)=name;/MethodspublicvoidUpdate(Stockstock)Console.WriteLine(Notifiedinvestor0of1schangeto2:C,name,stock.Symbol,stock.Price);/PropertiespublicStockStockgetreturns

13、tock;setstock=value;/ClientpublicclassObserverApppublicstaticvoidMain(stringargs)/CreateinvestorsInvestors=newInvestor(Sorros);Investorb=newInvestor(Berkshire);/CreateIBMstockandattachinvestorsIBMibm=newIBM(IBM,120.00);ibm.Attach(s);ibm.Attach(b);/Changeprice,whichnotifiesinvestorsibm.Price=120.10;i

14、bm.Price=121.00;ibm.Price=120.50;ibm.Price=120.75;Java中的观察者模式java.util.Observable,实现了大部分我们需要的目标的功能,还有一个接口Observer,其中定义了update方法,就是观察者的接口。C#的Observer模式实际上在C#中实现Observer模式没有这么辛苦,.NET中提供了Delegate与Event机制,我们可以利用这种机制简化Observer模式 A.14 委托与事件委托是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。委托

15、对象用关键字delegate来声明事件对象用event关键字声明例:猫和老鼠class Cat private string name; public Cat(string name) = name; public delegate void CatShoutEventHandler(); public event CatShoutEventHandler CatShout; public void Shout() Console.WriteLine(喵,我是0., name); if (CatShout != null) CatShout(); class Mouse p

16、rivate string name; public Mouse(string name) = name; public void Run() Console.WriteLine(老猫来了,0快跑!, name); static void Main(string args) Cat cat = new Cat(Tom); Mouse mouse1 = new Mouse(Jerry); Mouse mouse2 = new Mouse(Jack);cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);cat.Cat

17、Shout += new Cat.CatShoutEventHandler(mouse2.Run); cat.Shout(); Console.Read(); 实例化一个委托使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。 +=是增加委托实例对象的意思-=减少一个需要触发事件时通知的对象思考:为什么此处委托及事件调用时都没参数delegatevoidUpdateDelegate();/SubjectclassSubjectpubliceventUpdateDelegateUpdateHandler;/Me

18、thodspublicvoidAttach(UpdateDelegateud)UpdateHandler+=ud;publicvoidDetach(UpdateDelegateud)UpdateHandler-=ud;publicvoidNotify()if(UpdateHandler!=null)UpdateHandler();/ConcreteSubjectclassConcreteSubject:Subject/FieldsprivatestringsubjectState;/PropertiespublicstringSubjectStategetreturnsubjectState;

19、setsubjectState=value;/ConcreteObserverclassConcreteObserverprivatestringname;privatestringobserverState;privateConcreteSubjectsubject;publicConcreteObserver(ConcreteSubjectsubject,stringname)this.subject=subject;=name;publicvoidUpdate()observerState=subject.SubjectState;Console.WriteLine(O

20、bserver0snewstateis1,name,observerState);publicConcreteSubjectSubjectgetreturnsubject;setsubject=value;classAnotherObserver/MethodspublicvoidShow()Console.WriteLine(AnotherObservergotanNotification!);publicclassClientpublicstaticvoidMain(stringargs)ConcreteSubjects=newConcreteSubject();ConcreteObservero1=newConcreteObserver(s,1);ConcreteObservero2=newConcreteObserver(s,2);AnotherObservero3=newAnotherObserver();s.Attach(newUpdateDelegate(o1.Update);s.Attach(newUpdateDelegate(o2.Update);s.Attach(newUpdateDelegate(o3.Show);s.SubjectState=ABC;s.Notify();Console.WriteLine

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论