首页 / 设计模式 / OO设计模式_观察者模式
OO设计模式_观察者模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了OO设计模式_观察者模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3944字,纯文字阅读大概需要6分钟。
内容图文
![OO设计模式_观察者模式](/upload/InfoBanner/zyjiaocheng/1296/7341d8be088a462e91a634ff32da66d1.jpg)
Motivation:
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”————一个对象(目标对象)的状态发生改变,所有的依赖对象(观察这对象)都将得到通知。如果这样的依赖关系过于紧密,将是软件不能很好的抵御变化。
使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
Intent:
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生变化,所有依赖于它的对象都得到通知并自动更新。
Code:
1.不使用设计模式编程。
// 不使用设计模式编程 // AMT取钱并且通过终端通知用户账户信息。 // 每出现一个新的终端就需要在BankAccount类中添加一个新的终端类型字段并调用其方法。 public class ATM { BankAccount bankAccount; void Process(int data) { bankAccount.Withdraw(data); } } publicclass BankAccount { Email emailer;//Strong Dependence Mobile mobile;//Strong Dependencestring userEmail; string userPhoneNumber; publicvoid Withdraw(int data) { emailer.SendEmail(userEmail); mobile.SendNotification(userPhoneNumber); } } publicclass Email { publicvoid SendEmail(string userEmail) { //...Todo } } publicclass Mobile { publicvoid SendNotification(string userPhoneNumber) { //...Todo } }
2.观察者模式
// ******************************************* // 观察者模式 // 按照依赖倒置原则 // 观察者抽象成一个interface基类,主题抽象成一个abstract基类,abstract主题基类依赖interface观察者基类,不依赖于具体的观察类。 public class UserAccountArgs//用户参数:email,phone等terminal信息。 { privatestring userEmail; publicstring UserEmail { get { return userEmail; } set { userEmail = value; } } privatestring userPhoneNumber; publicstring UserPhoneNumber { get { return userPhoneNumber; } set { userPhoneNumber = value; } } } publicabstractclass Subject { private IList<IObserver> observerList = new List<IObserver>(); publicvoid Attach(IObserver observer) { observerList.Add(observer); } publicvoid Detach(IObserver observer) { observerList.Remove(observer); } publicvirtualvoid Notify(UserAccountArgs args) { foreach (IObserver observer in observerList) { observer.Update(args); } } } publicclass BankAccount : Subject { publicvoid Withdraw(int data) { UserAccountArgs args = new UserAccountArgs(); Notify(args); } } interface IObserver { publicabstractvoid Update(UserAccountArgs args); } publicclass Emailer : IObserver { publicoverridevoid Update(UserAccountArgs args) { string userEmail = args.UserEmail; //... } } publicclass Mobile : IObserver { publicoverridevoid Update(UserAccountArgs args) { string userPhoneNumber=args.UserPhoneNumber; //... } } publicclass ATM { UserAccountArgs args = new UserAccountArgs(); Subject bankAccount = new BankAccount(); IObserver emailer = new Emailer(); IObserver mobile = new Emailer(); void Process() { bankAccount.Attach(emailer); bankAccount.Attach(mobile); bankAccount.Notify(args); } }
3.事件模式
// *************************** // 事件模式 // 委托AccountEventHandler方法来实现观察者的方法,主题类不需要依赖IObject类,也不需要知道观察者的方法名。 public class Emailer { public void SendEmail(UserAccountArgs args) { string userEmail = args.UserEmail; //... } } publicclass Mobile { publicvoid SendMessage(UserAccountArgs args) { string userPhoneNumber = args.UserPhoneNumber; //... } } publicinterface Subject { void Notify(UserAccountArgs args); } publicdelegatevoid AccountEventHandler(UserAccountArgs args); publicclass BankAccount : Subject { publicevent AccountEventHandler Update; publicvoid Notify(UserAccountArgs args) { Update(args); } } publicclass ATM { UserAccountArgs args = new UserAccountArgs(); BankAccount bankAccount = new BankAccount(); Emailer emailer = new Emailer(); Mobile mobile = new Mobile(); void Process() { bankAccount.Update += new AccountEventHandler(emailer.SendEmail); bankAccount.Update += new AccountEventHandler(mobile.SendMessage); bankAccount.Notify(args); } } publicclass UserAccountArgs//用户参数:email,phone等terminal信息。 { privatestring userEmail; publicstring UserEmail { get { return userEmail; } set { userEmail = value; } } privatestring userPhoneNumber; publicstring UserPhoneNumber { get { return userPhoneNumber; } set { userPhoneNumber = value; } } }
Main Point:
使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合。
目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知,目标对象对此一无所知。
在C#的event中,委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象。委托是比抽象Observer接口更为松耦合的设计。
原文:http://www.cnblogs.com/xanadu123/p/4207116.html
内容总结
以上是互联网集市为您收集整理的OO设计模式_观察者模式全部内容,希望文章能够帮你解决OO设计模式_观察者模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。