概述
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。这也就是所谓的观察者模式!
故事情节:TT是一个非常善良友好的人,所以观察她的人比较多。有一次TT因为LG而哭了,她身边的人心情也立刻转变了...........
结构图:(略,下次有空我再补上吧)
程序结果:
我们用事件结和抽象来实现这种场景:

Code
1
//反应事件
2
public delegate void Reaction(object sender,EventArgs e);
3
4
//被观察者的抽象
5
public interface ISubject
6

{
7
//添加观察者动作
8
void AttachReaction(Reaction reaction);
9
10
//减去观察者动作
11
void DetachReaction(Reaction reaction);
12
13
//被观察者哭了
14
void Cry();
15
}

Code
1
//现实的故事中,TT是一个被别人关注的对象
2
3
//TT成了被观察者
4
public class TT:ISubject
5

{
6
//观察者反应情况字段
7
private event Reaction act;
8
9
//被观察者的名字字段
10
private string name;
11
12
//添加观察者动作
13
public void AttachReaction(Reaction reaction)
14
{
15
act+=reaction;
16
}
17
18
//减去观察者动作
19
public void DetachReaction(Reaction reaction)
20
{
21
act-=reaction;
22
}
23
24
//构造器
25
public TT(string name)
26
{
27
this.name=name;
28
}
29
30
//TT哭了
31
public void Cry()
32
{
33
//看看其他人的反应情况吧
34
Console.ForegroundColor=ConsoleColor.Cyan;
35
Console.WriteLine("{0}哭了",name);
36
Console.WriteLine();
37
Console.ResetColor();
38
if(act!=null)
39
{
40
act(this,new EventArgs());
41
}
42
}
43
}
TT的朋友们,也就是观察者了

Code
1
//观察者抽象
2
public interface IObserver
3

{ //观察TT
4
void ObserveTT(object sender,EventArgs e);
5
}
6
7
//观察TT的LG
8
public class LG:IObserver
9

{
10
private string name;
11
//构造器
12
public LG(string name)
13
{
14
this.name=name;
15
}
16
17
//观察TT
18
public void ObserveTT(object sender,EventArgs e)
19
{
20
Console.WriteLine("{0}:极其难受",name);
21
Console.WriteLine();
22
}
23
}
24
25
//观察TT的HXQ
26
public class HXQ:IObserver
27

{
28
private string name;
29
//构造器
30
public HXQ(string name)
31
{
32
this.name=name;
33
}
34
35
//观察TT
36
public void ObserveTT(object sender,EventArgs e)
37
{
38
Console.WriteLine("{0}:好难受",name);
39
Console.WriteLine();
40
}
41
}
42
43
//观察TT的LFN
44
public class LFN:IObserver
45

{
46
private string name;
47
//构造器
48
public LFN(string name)
49
{
50
this.name=name;
51
}
52
53
//观察TT
54
public void ObserveTT(object sender,EventArgs e)
55
{
56
Console.WriteLine("{0}:难受",name);
57
Console.WriteLine();
58
}
59
}
60
61
62
//观察TT的JH
63
public class JH:IObserver
64

{
65
private string name;
66
//构造器
67
public JH(string name)
68
{
69
this.name=name;
70
}
71
72
//观察TT
73
public void ObserveTT(object sender,EventArgs e)
74
{
75
Console.WriteLine("{0}:难受",name);
76
Console.WriteLine();
77
}
78
}
79

Code
1
//程序入口
2
public class MyProgram
3

{
4
5
public static void Main()
6
{
7
ISubject tt = new TT("TT");
8
IObserver lg = new LG("LG");
9
IObserver hxq=new HXQ("HXQ");
10
IObserver lfn=new LFN("LFN");
11
IObserver jh=new JH("JH");
12
13
tt.AttachReaction(new Reaction(lg.ObserveTT));
14
tt.AttachReaction(new Reaction(hxq.ObserveTT));
15
tt.AttachReaction(new Reaction(lfn.ObserveTT));
16
tt.AttachReaction(new Reaction(jh.ObserveTT));
17
18
Console.WriteLine("一年前:");
19
Console.WriteLine();
20
//TT第一次哭了
21
tt.Cry();
22
23
24
Console.WriteLine("十年后:");
25
Console.WriteLine();
26
//TT第二次偷偷的哭了,LG不知道,LG不是故事中的观察者了
27
tt.DetachReaction(new Reaction(lg.ObserveTT));
28
29
//TT第二次哭了
30
tt.Cry();
31
32
Console.ReadKey();
33
}
34
}
欢迎大家指出问题!谢谢
作者:Louja
出处:http://louja.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此声明,且在文章页面给出原文连接,否则保留追究法律责任的权利。
posted on 2008-09-08 13:40
louja 阅读(1150)
评论(5) 编辑 收藏 网摘 所属分类:
TT和LG编程系列之模式