Chinaunix首页 | 论坛 | 博客
  • 博客访问: 243260
  • 博文数量: 164
  • 博客积分: 60
  • 博客等级: 民兵
  • 技术积分: 1129
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 21:55
文章分类

全部博文(164)

文章存档

2017年(2)

2015年(67)

2014年(95)

我的朋友

分类: Java

2015-03-27 16:42:37

1. 模式介绍

模式的定义

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

模式的使用场景

  • 关联行为场景。需要注意的是,关联行为是可拆分的,而不是“组合”关系;
  • 事件多级触发场景;
  • 跨系统的消息交换场景,如消息队列、事件总线的处理机制。

2. UML类图

角色介绍

  • 抽象主题 (Subject) 角色
    抽象主题角色把所有观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。

  • 具体主题 (ConcreteSubject) 角色
    将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。

  • 抽象观察者 (Observer) 角色
    为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。

  • 具体观察者 (ConcreteObserver) 角色
    存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态 像协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。

3. 模式的简单实现


点击(此处)折叠或打开

  1. // 订阅号抽象类
  2.     public abstract class TenXun
  3.     {
  4.         // 保存订阅者列表
  5.         private List<IObserver> observers = new List<IObserver>();
  6.  
  7.         public string Symbol { get; set; }
  8.         public string Info { get; set; }
  9.         public TenXun(string symbol, string info)
  10.         {
  11.             this.Symbol = symbol;
  12.             this.Info = info;
  13.         }
  14.  
  15.         #region 新增对订阅号列表的维护操作
  16.         public void AddObserver(IObserver ob)
  17.         {
  18.             observers.Add(ob);
  19.         }
  20.         public void RemoveObserver(IObserver ob)
  21.         {
  22.             observers.Remove(ob);
  23.         }
  24.         #endregion
  25.  
  26.         public void Update()
  27.         {
  28.             // 遍历订阅者列表进行通知
  29.             foreach (IObserver ob in observers)
  30.             {
  31.                 if (ob != null)
  32.                 {
  33.                     ob.ReceiveAndPrint(this);
  34.                 }
  35.             }
  36.         }
  37.     }
  38.  
  39.     // 具体订阅号类
  40.     public class TenXunGame : TenXun
  41.     {
  42.         public TenXunGame(string symbol, string info)
  43.             : base(symbol, info)
  44.         {
  45.         }
  46.     }
  47.  
  48.     // 订阅者接口
  49.     public interface IObserver
  50.     {
  51.         void ReceiveAndPrint(TenXun tenxun);
  52.     }
  53.  
  54.     // 具体的订阅者类
  55.     public class Subscriber : IObserver
  56.     {
  57.         public string Name { get; set; }
  58.         public Subscriber(string name)
  59.         {
  60.             this.Name = name;
  61.         }
  62.  
  63.         public void ReceiveAndPrint(TenXun tenxun)
  64.         {
  65.             Console.WriteLine("Notified {0} of {1}'s" + " Info is: {2}", Name, tenxun.Symbol, tenxun.Info);
  66.         }
  67.     }
  68.  
  69.     // 客户端测试
  70.     class Program
  71.     {
  72.         static void Main(string[] args)
  73.         {
  74.             TenXun tenXun = new TenXunGame("TenXun Game", "Have a new game published ....");
  75.  
  76.             // 添加订阅者
  77.             tenXun.AddObserver(new Subscriber("Learning Hard"));
  78.             tenXun.AddObserver(new Subscriber("Tom"));
  79.  
  80.             tenXun.Update();
  81.  
  82.             Console.ReadLine();
  83.         }
  84.     }




阅读(624) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~