设为首页 加入收藏

TOP

设计模式-行为型-观察者模式(一)
2019-10-09 19:58:54 】 浏览:111
Tags:设计模式 行为 观察者 模式

观察者模式(Observer):

  指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

观察者模式的角色:

   

  1)抽象目标(Subject):也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。 

  2)具体目标(ConcreteSubject):也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。 

  3)抽象观察者(Observer):它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。 

  4)具体观察者(ConcreteObserver):实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。 

 1 internal class Program
 2 {
 3     private static void Main(string[] args)
 4     {
 5         Subject subject = new ConcreteSubject();
 6         Observer observer1 = new ConcreteObserver1();
 7         Observer observer2 = new ConcreteObserver2();
 8         subject.Attach(observer1);
 9         subject.Attach(observer2);
10         subject.Notify();
11     }
12 }
13 
14 /// <summary>
15 /// 抽象目标
16 /// </summary>
17 internal abstract class Subject
18 {
19     /// <summary>
20     /// 新增观察者
21     /// </summary>
22     /// <param name="o"></param>
23     public abstract void Attach(Observer o);
24 
25     /// <summary>
26     /// 删除观察者
27     /// </summary>
28     /// <param name="o"></param>
29     public abstract void Detach(Observer o);
30 
31     /// <summary>
32     /// 通知观察者
33     /// </summary>
34     public abstract void Notify();
35 }
36 
37 /// <summary>
38 /// 抽象观察者
39 /// </summary>
40 internal abstract class Observer
41 {
42     public abstract void update();
43 }
44 
45 /// <summary>
46 /// 具体目标
47 /// </summary>
48 internal class ConcreteSubject : Subject
49 {
50     private System.Collections.Generic.List<Observer> observers
51         = new System.Collections.Generic.List<Observer>();
52 
53     public override void Attach(Observer o)
54     {
55         if (o != null)
56             observers.Add(o);
57     }
58 
59     public override void Detach(Observer o)
60     {
61         if (o != null)
62             observers.Remove(o);
63     }
64 
65     public override void Notify()
66     {
67         Console.WriteLine("目标发生变化");
68         foreach (var observer in observers)
69         {
70             observer.update();
71         }
72     }
73 }
74 
75 /// <summary>
76 /// 具体观察者1
77 /// </summary>
78 internal class ConcreteObserver1 : Observer
79 {
80     public override void update()
81     {
82         Console.WriteLine("观察者1更新");
83     }
84 }
85 
86 /// <summary>
87 /// 具体观察者2
88 /// </summary>
89 internal class ConcreteObserver2 : Observer
90 {
91     public override void update()
92     {
93         Console.WriteLine("观察者2更新");
94     }
95 }

 事例:

  学校的“铃”是事件源和目标,"学生"是事件监听器和具体观察者,"铃声"是事件类。当下课时间到,会触发铃发声,这时会生成“铃声”事件;学生就会做一些事情。。。

  1 internal class Program
  2 {
  3     private static void Main(string[] args)
  4     {
  5         // 创建下课铃声
  6         Bell subject = new FinishClassBell();
  7         // 创建观察者
  8         Observer xiaoming = new XiaoMing();
  9         Observer xiaohong = new XiaoHong();
 10         Observer xiaowang = new XiaoWang();
 11         // 观察者随着听着下课铃
 12         subject.Attach(xiaoming);
 13         subject.Attach(xiaohong);
 14         subject.Attach(xiaowang);
 15         // 下课铃响了,通知大家
 16         subject.Notify();
 17     }
 18 }
 19 
 20 /// <summary>
 21 /// 铃声:抽象目标
 22 /// </summary>
 23 internal abstract class Bell
 24 {
 25     /// <summary>
 26     /// 新增观察者
 27     /// </summary>
 28     /// <param name="o"></param>
 29     public abstract void Attach(Observer
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇设计模式-行为型-状态模式 下一篇从无到有,构建GIS + BIM大厦

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目