设计模式- 观察者模式

来源:互联网 发布:超级老师软件下载 编辑:程序博客网 时间:2024/04/30 23:37

Gof定义

定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通 知并自动更新

理解

观察者设计模式:当一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。例如你在淘宝上购买了一件商品,当你付完钱后,你的淘宝帐户里会记录等待卖家发货这条信息,你的手机会收到一条短信说你手机银行里扣了钱,你的邮箱也可能会收到一封邮件。

UML图

银行取钱例子

[csharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace 观察者模式  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             BankAccount bank = new BankAccount();  
  13.             bank.AddObserver(new Emailer());  
  14.             bank.AddObserver(new Mobile());  
  15.             bank.Withdraw();  
  16.               
  17.             Console.ReadLine();  
  18.         }  
  19.     }  
  20.   
  21.     public class UserAccountArgs  
  22.     {  
  23.         public string Email { getset; }  
  24.         public string PhoneNumber { getset; }  
  25.   
  26.         public UserAccountArgs(string mail, string phoneNumber)  
  27.         {  
  28.             Email = mail;  
  29.             PhoneNumber = phoneNumber;  
  30.         }  
  31.     }  
  32.   
  33.     public interface IAccountObserver  
  34.     {  
  35.         void Update(UserAccountArgs args);  
  36.     }  
  37.   
  38.     public class Emailer : IAccountObserver  
  39.     {  
  40.         public void Update(UserAccountArgs args)  
  41.         {  
  42.             Console.WriteLine("消息已发送邮件至邮箱:" + args.Email);  
  43.         }  
  44.     }  
  45.   
  46.     public class Mobile : IAccountObserver  
  47.     {  
  48.         public void Update(UserAccountArgs args)  
  49.         {  
  50.             Console.WriteLine("消息已发送短信至手机:" + args.PhoneNumber);  
  51.         }  
  52.     }  
  53.   
  54.     public class BankAccount  
  55.     {  
  56.         List<IAccountObserver> list = new List<IAccountObserver>();  
  57.   
  58.         public void Withdraw()  
  59.         {  
  60.             Console.WriteLine("取钱任务结束");  
  61.   
  62.             //先写死,给UserAccountArgs初始化  
  63.             UserAccountArgs args = new UserAccountArgs("ccx@126.com""135346123113");  
  64.             //给有添加到List列表里(有观察的对象,发送通知)  
  65.             foreach (var item in list)  
  66.             {  
  67.                 item.Update(args);  
  68.             }  
  69.         }  
  70.         //添加  
  71.         public void AddObserver(IAccountObserver observer)  
  72.         {  
  73.             list.Add(observer);  
  74.         }  
  75.         //移除  
  76.         public void RemoveObserver(IAccountObserver observer)  
  77.         {  
  78.             list.Remove(observer);  
  79.         }  
  80.   
  81.     }  
  82.   
  83. }  

银行取钱例子,进一步,正确写法

[csharp] view plaincopy
  1. namespace 观察者模式  
  2. {  
  3.     class Program  
  4.     {  
  5.         static void Main(string[] args)  
  6.         {  
  7.             BankAccount bank = new BankAccount();  
  8.             bank.AddObserver(new Emailer());  
  9.             bank.AddObserver(new Mobile());  
  10.             bank.Withdraw();  
  11.               
  12.             Console.ReadLine();  
  13.         }  
  14.     }  
  15.   
  16.     public class UserAccountArgs  
  17.     {  
  18.         public string Email { getset; }  
  19.         public string PhoneNumber { getset; }  
  20.   
  21.         public UserAccountArgs(string mail, string phoneNumber)  
  22.         {  
  23.             Email = mail;  
  24.             PhoneNumber = phoneNumber;  
  25.         }  
  26.     }  
  27.   
  28.     public interface IAccountObserver  
  29.     {  
  30.         void Update(UserAccountArgs args);  
  31.     }  
  32.   
  33.     public class Emailer : IAccountObserver  
  34.     {  
  35.         public void Update(UserAccountArgs args)  
  36.         {  
  37.             Console.WriteLine("消息已发送邮件至邮箱:" + args.Email);  
  38.         }  
  39.     }  
  40.   
  41.     public class Mobile : IAccountObserver  
  42.     {  
  43.         public void Update(UserAccountArgs args)  
  44.         {  
  45.             Console.WriteLine("消息已发送短信至手机:" + args.PhoneNumber);  
  46.         }  
  47.     }  
  48.   
  49.     public class Subject  
  50.     {  
  51.         List<IAccountObserver> list = new List<IAccountObserver>();  
  52.   
  53.         //通知  
  54.         public void Notify(UserAccountArgs args)  
  55.         {  
  56.             foreach (var item in list)  
  57.             {  
  58.                 item.Update(args);  
  59.             }  
  60.         }  
  61.         //添加  
  62.         public void AddObserver(IAccountObserver observer)  
  63.         {  
  64.             list.Add(observer);  
  65.         }  
  66.         //移除  
  67.         public void RemoveObserver(IAccountObserver observer)  
  68.         {  
  69.             list.Remove(observer);  
  70.         }  
  71.   
  72.     }  
  73.   
  74.     public class BankAccount : Subject  
  75.     {  
  76.         public void Withdraw()  
  77.         {  
  78.             Console.WriteLine("取钱完成!");  
  79.   
  80.             UserAccountArgs args = new UserAccountArgs("ccx@126.com""1353463213");  
  81.             Notify(args);  
  82.         }  
  83.     }  
  84. }