观察者模式,是一种一对多的设计模式,观察者与被观察者存在着某种关系,当被观察者的状态发生转变时,观察者要求作出相应动作。从这个意义上来说,在这个一对多的设计模式中,“一”指的是被观察者,“多”指的是观察者。观察者很多时候都会要求注册到被观察者中,以便当被观察者状态改变时,观察者能够及时的得到响应。所有的观察者都只关心某一被观察者的状态,这么一来,如果有多个被观察者,事实上,观察者都只会注册到其感兴趣的部分。
典型的观察者模式,是猫叫-主人醒-贼跑,下面用观察者模式来实现这一系列动作。
首先来定义观察者的接口
1
public interface IObserver
2
{
3
void Response();
4
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
再来是被观察者
1
public interface ISubject
2
{
3
void Register(IObserver observer);
4
void Unregister(IObserver observer);
5
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
下面是具体的角色
1
public class Master : IObserver
2
{
3
protected string name;
4![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
public Master(string name, ISubject subject)
6
{
7
this.name = name;
8
subject.Register(this);
9![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
Console.WriteLine(string.Format("{0} sleeping
", name));
11
}
12![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
IObserver Members
21
}
22![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
23
public class Thief : IObserver
24
{
25
protected string name;
26![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
public Thief(string name, ISubject subject)
28
{
29
this.name = name;
30
subject.Register(this);
31![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
Console.WriteLine(string.Format("{0} trying to thieve
", name));
33
}
34![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
IObserver Members
43
}
44![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
45
public class Cat : ISubject
46
{
47
protected List<IObserver> observers;
48
protected string name;
49![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
50
public Cat(string name)
51
{
52
this.name = name;
53
observers = new List<IObserver>();
54
}
55![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
public void Cry()
57
{
58
Console.WriteLine(string.Format("{0} cry
", name));
59
foreach (IObserver item in observers)
60
{
61
item.Response();
62
}
63
}
64![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
65
ISubject Members
80
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
33
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
34
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
43
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
44
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
45
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
46
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
47
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
48
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
49
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
50
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
51
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
52
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
53
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
54
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
55
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
57
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
58
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/dot.gif)
59
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
60
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
61
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
62
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
63
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
64
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
65
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
80
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
OK, 我们来Test一下
1
class Program
2
{
3
static void Main(string[] args)
4
{
5
Cat cat = new Cat("Cat");
6
Master master = new Master("Master", cat);
7
Thief thief = new Thief("Thief", cat);
8![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
cat.Cry();
10
Console.ReadLine();
11
}
12
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)