观察者模式是实现一个对象对多个对象通知的解决方案(订阅和发布关系),任何人只要符合一定的条件(实现订阅者接口)就可以订阅一份报纸。报馆向每一个订阅了该报纸的人投递报纸。订阅者可以随时退订报纸,其他的人也可以随时订阅报纸。
//订阅者接口,只要你能够接收报纸,我就让你订阅。
//发布者接口,总得是个报馆吧,别人不可能到茶馆起订报。并且还的是个正规的报馆,可以正常的订阅,发送报纸,取消订阅这些好像太重要了。
// 一切准备就绪。开始卖报了...
//订阅者接口,只要你能够接收报纸,我就让你订阅。
1
namespace Observer
2
{
3
public interface IReceiver
4
{
5
string Receive();
6
}
7
}
8![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
public class AReceiver : IReceiver
11
{
12
string Message = "A sended";
13
public string Receive()
14
{
15
System.Diagnostics.Debug.WriteLine(Message);
16
return Message;
17
}
18
}
19
class RtxReceiver : IReceiver
20
{
21
string Message = "rtx sended";
22
public string Receive()
23
{
24
System.Diagnostics.Debug.WriteLine(Message);
25
return Message;
26
}
27
}
28![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](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/ExpandedSubBlockEnd.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
//发布者接口,总得是个报馆吧,别人不可能到茶馆起订报。并且还的是个正规的报馆,可以正常的订阅,发送报纸,取消订阅这些好像太重要了。
1
public abstract class ISubject
2
{
3
public abstract void AddListener(IReceiver Receiver);
4
public abstract void Advice();
5
public abstract void Remove(IReceiver Receiver);
6
}
7![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
public class ReceiverManager : ISubject
9
{
10
List<IReceiver> Receiverlist = new List<IReceiver>();
11
public override void Advice()
12
{
13
foreach (IReceiver Receiver in Receiverlist)
14
{
15
Receiver.Receive();
16
}
17
}
18
public override void AddListener(IReceiver Receiver)
19
{
20
this.Receiverlist.Add(Receiver);
21
}
22
public override void Remove(IReceiver Receiver)
23
{
24
if (Receiverlist.IndexOf(Receiver) > 0)
25
{
26
Receiverlist.Remove(Receiver);
27
}
28
}
29
}
30![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](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/ExpandedBlockEnd.gif)
7
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
10
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
26
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
27
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// 一切准备就绪。开始卖报了...
1
void ObserverAdivce()
2
{
3
string[] Managedsenderlist = new string[3];
4
Managedsenderlist[0] = new string("AReceiver ".ToCharArray());
5
Managedsenderlist[1] = new string("BReceiver ".ToCharArray());
6
//模拟从配置文件中读出配置信息
7![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
List<ISender> ManagedsenderArray = new List<ISender>();
9![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
for (int k = 0; k < Managedsenderlist.Length; k++)
11
{
12
ManagedsenderArray.Add((ISender)System.Activator.CreateInstance(Type.GetType("Observer." + Managedsenderlist[k] + ",Observer")));
13
}
14
SenderManager s = new SenderManager();
15
for (int j = 0; j < Managedsenderlist.Length; j++)
16
{
17
s.AddListener(ManagedsenderArray[j]);
18
}
19![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
s.Advice(); //输出窗口里有结果了
21![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
s.Remove(ManagedsenderArray[1]);//AReceiver 我不订了。
23
s.Advice();
24
s.AddListener(ManagedsenderArray[1]);//重新订阅
25
s.AddListener(ManagedsenderArray[1]); //来两份吧
26
s.Advice(); //两份报纸都收到了!
27
}
28![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
29
30
}
![](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/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/ExpandedSubBlockStart.gif)
12
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
14
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
17
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
19
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.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/ExpandedBlockEnd.gif)
28
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
29
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
30
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
ISubject还可能有哪些作用呢?订阅者还可以通过自己的方法去订阅和取消订阅。
1
class AReceiver : IReiver
2
{
3
void remove(ISubject subject)
4
{
5
subject.Remove(this);
6![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
}
8
void AddListener(ISubject subject)
9
{
10
subject.AddListener(this);
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/ExpandedSubBlockEnd.gif)
8
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.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)
这样好像很方便了吧。毕竟你要add 或 remove 你重新new 一个SenderManager 的话 原来那个 SenderManager 的状态就不在了。谁知道给你发了几次报纸了。这样你就要一个报馆的引用了。可是我不能只订SenderManager 你的报纸吧。我还的长沙晚报啊什么的。反正只要死报馆的我都有权利订阅。所以就有一个接口了。