设计模式笔记(十) —— 观察者模式

观察者模式(Observer):又叫发布/订阅模式(Publish/Subscribe)
      它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对者,使它能够自动更新自己。
      使用场合:
      当一个对象的改变需要改变其它对象的时候,而且需要同时改变其它对象的时候,应该考虑使用观察者模式。
      从这种模式衍生出来的一种技术,叫做事件委托。
      委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与方法有相同的行为,委托必须有相同的方法签名(参数和返回值相同)。一个委托可以搭载多个方法,所有方法被依次唤起。可以使委托搭载对象方法并不需要同一个类。

  1. using System;
  2. using System.Collections.Generic;
  3. namespace StuDesignMode.Observer
  4. {
  5.     /// <summary>
  6.     /// 抽象通知者
  7.     /// </summary>
  8.     interface ISubject
  9.     {
  10.         string SubjectStatus { getset; }
  11.         /// <summary>
  12.         /// 添加观察者
  13.         /// </summary>
  14.         /// <param name="observer"></param>
  15.         void Attach(AbsObserver observer);
  16.         /// <summary>
  17.         /// 删除观察者
  18.         /// </summary>
  19.         /// <param name="observer"></param>
  20.         void Detach(AbsObserver observer);
  21.         /// <summary>
  22.         /// 通知观察者
  23.         /// </summary>
  24.         void Noticy();
  25.     }
  26.     /// <summary>
  27.     /// 抽象观察者
  28.     /// </summary>
  29.     abstract class AbsObserver
  30.     {
  31.         public string Name { getset; }
  32.         public ISubject Subject { getset; }
  33.         public AbsObserver(string name, ISubject subject)
  34.         {
  35.             this.Name = name;
  36.             this.Subject = subject;
  37.         }
  38.         public abstract void Update();
  39.     }
  40.     /// <summary>
  41.     /// 通知者,老板
  42.     /// </summary>
  43.     class Boss : ISubject
  44.     {
  45.         //员工列表
  46.         private IList<AbsObserver> observers = new List<AbsObserver>();
  47.         //老板状态
  48.         public string SubjectStatus { get;set; }
  49.         public void Attach(AbsObserver observer)
  50.         {
  51.             this.observers.Add(observer);
  52.         }
  53.         public void Detach(AbsObserver observer)
  54.         {
  55.             this.observers.Remove(observer);
  56.         }
  57.         public void Noticy()
  58.         {
  59.             foreach (AbsObserver o in observers)
  60.             {
  61.                 o.Update();
  62.             }
  63.         }
  64.     }
  65.     delegate void EventHandler();
  66.     /// <summary>
  67.     /// 秘书,将采用事件来通知各员工
  68.     /// </summary>
  69.     class Secretary :ISubject
  70.     {
  71.         public string SubjectStatus { get;set; }
  72.         public event EventHandler Update;
  73.         public void Attach(AbsObserver observer)
  74.         {
  75.             Console.WriteLine("此方法不实现,要使用事件来发布给观察者(订阅者)!");
  76.         }
  77.         public void Detach(AbsObserver observer)
  78.         {
  79.             Console.WriteLine("此方法不实现,要使用事件来发布给观察者(订阅者)!");
  80.         }
  81.         public void Noticy()
  82.         {
  83.             this.Update();
  84.         }
  85.     }
  86.     /// <summary>
  87.     /// 玩游戏的同事
  88.     /// </summary>
  89.     class GamePlayer : AbsObserver
  90.     {
  91.         public GamePlayer(string name, ISubject subject)
  92.             : base(name, subject) { }
  93.         public override void Update()
  94.         {
  95.             Console.WriteLine("{0} {1}游戏存盘,继续工作!",this.Subject.SubjectStatus,this.Name);
  96.         }
  97.     }
  98.     class ChatQQ:AbsObserver
  99.     {
  100.         public ChatQQ(string name, ISubject subject)
  101.             : base(name, subject) { }
  102.         public override void Update()
  103.         {
  104.             Console.WriteLine("{0} {1}关掉QQ,继续工作!",this.Subject.SubjectStatus,this.Name);
  105.         }
  106.     }
  107.     public class ClientTest
  108.     {
  109.         static void Main(string[] args)
  110.         {
  111.             Boss huhansan = new Boss();
  112.             GamePlayer xiaoli = new GamePlayer("小李", huhansan);
  113.             ChatQQ xiaowang = new ChatQQ("小王", huhansan);
  114.             huhansan.Attach(xiaoli);
  115.             huhansan.Attach(xiaowang);
  116.             huhansan.SubjectStatus = "我胡汉三又回来了!";
  117.             huhansan.Noticy();
  118.             Console.WriteLine();
  119.         }
  120.         /// <summary>
  121.         /// 测试使用事件[观察者模式]
  122.         /// </summary>
  123.         public static void TestEventHandler()
  124.         {
  125.             Secretary qiantai = new Secretary();
  126.             GamePlayer xiaoli = new GamePlayer("小李", qiantai);
  127.             ChatQQ xiaowang = new ChatQQ("小王", qiantai);
  128.             qiantai.Update += new StuDesignMode.Observer.EventHandler(xiaoli.Update);
  129.             qiantai.Update += new StuDesignMode.Observer.EventHandler(xiaowang.Update);
  130.             //取消订阅
  131.             qiantai.Update -= new StuDesignMode.Observer.EventHandler(xiaowang.Update);
  132.             qiantai.SubjectStatus = "老板回来了";
  133.             qiantai.Noticy();
  134.         }
  135.     }
  136. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值