设计模式教学ppt课件

上传人:txadgkn****dgknqu... 文档编号:242697923 上传时间:2024-09-01 格式:PPT 页数:43 大小:214.27KB
返回 下载 相关 举报
设计模式教学ppt课件_第1页
第1页 / 共43页
设计模式教学ppt课件_第2页
第2页 / 共43页
设计模式教学ppt课件_第3页
第3页 / 共43页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,观察者(Observer)模式,观察者(Observer)模式,1,课本例子,办公时间做与工作无关的事情,在老板到来时,前台负责通知好友进入工作状态,注意开放-封闭原则,依赖倒转原则,降低耦合性。,课本例子办公时间做与工作无关的事情,2,通知者接口,interface Subject,void Attach(Observer observer);,void Detach(Observer observer);,void Notify();,string SubjectState,get;,set;,通知者接口interface Subject,3,class Secretary : Subject,/,同事列表,private IList observers = new List();,private string action;,/,增加,public void,Attach,(Observer observer),observers.Add(observer);,/,减少,public void,Detach,(Observer observer),observers.Remove(observer);,class Secretary : Subject,4,/,通知,public void,Notify,(),foreach (Observer o in observers),o.,Update,();,/,前台状态,public string SubjectState,get return action; ,set action = value; ,/通知,5,抽象观察者,abstract class Observer,protected string name;,protected Subject sub;,public Observer(string name, Subject sub),this.name = name;,this.sub = sub;,public abstract void Update();,抽象观察者abstract class Observer,6,看股票的同事,class StockObserver : Observer,public StockObserver(string name, Subject sub),: base(name, sub),public override void Update(),Console.WriteLine(0 1,关闭股票行情,继续工作!, sub.SubjectState, name);,看股票的同事class StockObserver : Ob,7,看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);,看NBA的同事 class NBAObserver : Ob,8,客户端,class Program,static void Main(string args),Secretary 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();,客户端class Program,9,观察者模式又叫做:,发布-订阅(Publish/Subscribe)模式,模型-视图(Model/View)模式,源-监听器(Source/Listener)模式,从属者(Dependents)模式。,观察者模式又叫做:,10,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监,11,一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其它的对象做出相应的改变。做到这一点的设计方案有很多,但是,为了使系统能够易于复用,应该选择低耦合度的设计方案,。,减少对象之间的耦合有利于系统的复用,但是同时设计师需要使这些低耦合度的对象之间能够维持行动的协调一致,保证高度的协作(Collaboration)。,观察者模式是满足这一要求的各种设计方案中最重要的一种。,一个软件系统常常要求在某一个对象的状态发生变化的时候,某些其,12,观察者模式的结构,观察者模式的结构,13,抽象主题(Subject)角色:,一个目标可以被多个观察者观察,目标提供对观察者注册和退订的维护,当目标的状态发生变化时,目标负责通知所有注册的、有效地观察者,抽象主题(Subject)角色:,14,抽象观察者(Observer)角色:,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。抽象观察者角色一般用一个抽象类或者一个接口实现。在这个示意性的实现中,更新接口只包含一个方法(即Update()方法),这个方法叫做,更新方法。,抽象观察者(Observer)角色:为所有的具体观察者定义一,15,具体主题(ConcreteSubject)角色:,将有关状态存入具体现察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做,具体被观察者角色,(Concrete Observable)。具体主题角色通常用一个具体子类实现。,具体主题(ConcreteSubject)角色:将有关状态存,16,具体观察者(ConcreteObserver)角色:,具体现察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体现察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。,具体观察者(ConcreteObserver)角色:具体现察,17,认识观察者模式,目标和观察者之间的关系,典型的一对多的关系,单向依赖,观察者依赖于目标,触发通知的时机,完成了状态维护后触发,相互观察,A、B观察C,B、C观察A(两套观察模式),注意死循环,通知的顺序,绝对不要依赖于通知的顺序,多个观察者之间的功能是平行的,相互不应该有先后的依赖关系,认识观察者模式目标和观察者之间的关系,18,观察者模式的效果有以下几个优点:,观察者模式实现了观察者和目标之间的抽象耦合。,观察者模式实现了动态联动,观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。,观察者模式的效果有以下几个优点:观察者模式实现了观察者和目标,19,缺点,可能会引起无谓的操作。,由于采用广播方式,不管观察者需不需要,每个观察者都会被调用update方法,缺点可能会引起无谓的操作。,20,本质,触发联动,本质触发联动,21,一个实际应用观察者模式的例子,该例子演示了注册的投资者在股票市场发生变化时,可以自动得到通知,一个实际应用观察者模式的例子 该例子演示了注册的投资者在股,22,/Subject,abstractclassStock/Fieldsprotectedstringsymbol;protecteddoubleprice;privateArrayListinvestors=newArrayList();,/Constructor,publicStock(stringsymbol,doubleprice)this.symbol=symbol;this.price=price;,/Methods,publicvoidAttach(Investorinvestor)investors.Add(investor);publicvoidDetach(Investorinvestor)investors.Remove(investor);publicvoidNotify()foreach(Investoriininvestors)i.Update(this);,/SubjectabstractclassSt,23,/PropertiespublicdoublePricegetreturnprice;setprice=value;Notify();,publicstringSymbolgetreturnsymbol;setsymbol=value;,/Propertiespublicdouble,24,/ConcreteSubjectclassIBM:Stock/ConstructorpublicIBM(stringsymbol,doubleprice):base(symbol,price),/Observer,interfaceIInvestor,/Methods,voidUpdate(Stockstock);,/ConcreteSubjectclassIBM,25,/ConcreteObserverclassInvestor:IInvestor/Fieldsprivatestringname;privatestringobserverState;privateStockstock;/ConstructorspublicInvestor(stringname)this.name=name;/MethodspublicvoidUpdate(Stockstock)Console.WriteLine(Notifiedinvestor0of1schangeto2:C,name,stock.Symbol,stock.Price);/PropertiespublicStockStockgetreturnstock;setstock=value;,/ConcreteObserverclassIn,26,/Client,publicclassObserverApppublicstaticvoidMain(stringargs)/CreateinvestorsInvestors=newInvestor(Sorros);Investorb=newInvestor(Berkshire);/CreateIBMstockandattachinvestorsIBMibm=newIBM(IBM,120.00);ibm.Attach(s);ibm.Attach(b);/Changeprice,whichnotifiesinvestorsibm.Price=120.10;ibm.Price=121.00;ibm.Price=120.50;ibm.Price=120.75;,/Client,27,Java中的观察者模式,java.util.Observable,实现了大部分我们需要的目标的功能,还有一个接口Observer,其中定义了update方法,就是观察者的接口。,Java中的观察者模式java.util.Observabl,28,C#的Observer模式,实际上在C#中实现Observer模式没有这么辛苦,.NET中提供了Delegate与Event机制,我们可以利用这种机制简化Observer模式,C#的Observer模式实际上在C#中实现Observer,29,A.14 委托与事件,委托,是对函数的封装,可以当作给方法的特征指定一个名称。而,事件,则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。,委托对象用关键字delegate来声明,事件对象用event关键字声明,例:猫和老鼠,A.14 委托与事件委托是对函数的封装,可以当作给方法的特征,30,class Cat,private string name;,public Cat(string name),this.name = name;,public delegate void,CatShoutEventHandler,(),;,public event CatShoutEventHandler CatShout;,public void Shout(),Console.WriteLine(喵,我是0., name);,if (CatShout != null),CatShout,(),;,class Cat,31,class Mouse,private string name;,public Mouse(string name),this.name = name;,public void,Run(),Console.WriteLine(老猫来了,0快跑!, name);,class Mouse,32,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.CatShout,+=,new Cat.CatShoutEventHandler(mouse2.Run);,cat.Shout();,Console.Read();,实例化,一个委托,static void Main(string args,33,使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。,+=是增加委托实例对象的意思,-=减少一个需要触发事件时通知的对象,思考:为什么此处委托及事件调用时都没参数,使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(,34,delegate,voidUpdateDelegate();/SubjectclassSubjectpublic,event,UpdateDelegateUpdateHandler;/MethodspublicvoidAttach(UpdateDelegateud)UpdateHandler+=ud;publicvoidDetach(UpdateDelegateud)UpdateHandler-=ud;publicvoidNotify()if(UpdateHandler!=null)UpdateHandler();,delegatevoidUpdateDelegate(),35,/ConcreteSubjectclassConcreteSubject:Subject/FieldsprivatestringsubjectState;/PropertiespublicstringSubjectStategetreturnsubjectState;setsubjectState=value;,/ConcreteSubjectclassConcre,36,/ConcreteObserverclassConcreteObserverprivatestringname;privatestringobserverState;privateConcreteSubjectsubject;publicConcreteObserver(ConcreteSubjectsubject,stringname)this.subject=subject;this.name=name;publicvoidUpdate()observerState=subject.SubjectState;Console.WriteLine(Observer0snewstateis1,name,observerState);publicConcreteSubjectSubjectgetreturnsubject;setsubject=value;,/ConcreteObserverclassCo,37,classAnotherObserver/MethodspublicvoidShow()Console.WriteLine(AnotherObservergotanNotification!);,classAnotherObserver/M,38,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(-);s.Detach(newUpdateDelegate(o1.Update);s.SubjectState=DEF;s.Notify();,publicclassClientpubli,39,关键的代码如下:,delegatevoidUpdateDelegate();,定义一个Delegate,用来规范函数结构。不管是ConcreteObserver类的Update方法还是AnotherObserver类的Show方法都符合该Delegate。这不象用Observer接口来规范必须使用Update方法那么严格。只要符合Delegate所指定的方法结构的方法都可以在后面被事件所处理。,关键的代码如下:delegatevoidUpdateDe,40,publiceventUpdateDelegateUpdateHandler;,定义一个事件,一旦触发,可以调用一组符合UpdateDelegate规范的方法。,publiceventUpdateDelegateUp,41,publicvoidAttach(UpdateDelegateud)UpdateHandler+=ud;,订阅事件。只要是一个满足UpdateDelegate的方法,就可以进行订阅操作(如下所示),s.Attach(newUpdateDelegate(o1.Update);s.Attach(newUpdateDelegate(o2.Update);s.Attach(newUpdateDelegate(o3.Show);,publicvoidAttach(UpdateDe,42,在Notify方法中:,publicvoidNotify()if(UpdateHandler!=null)UpdateHandler();,只要UpdateHandler != null(表示有订阅者),就可以触发事件(UpdateHandler()),所有的订阅者便会接到通知。,在Notify方法中:,43,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!