概述
在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。这也就是所谓的观察者模式!
故事情节:TT是一个非常善良友好的人,所以观察她的人比较多。有一次TT因为LG而哭了,她身边的人心情也立刻转变了...........
结构图:(略,下次有空我再补上吧)
程序结果:
我们用事件结和抽象来实现这种场景:
Code
1//反应事件
2public delegate void Reaction(object sender,EventArgs e);
3
4//被观察者的抽象
5public interface ISubject
6{
7 //添加观察者动作
8 void AttachReaction(Reaction reaction);
9
10 //减去观察者动作
11 void DetachReaction(Reaction reaction);
12
13 //被观察者哭了
14 void Cry();
15}
1//反应事件
2public delegate void Reaction(object sender,EventArgs e);
3
4//被观察者的抽象
5public 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成了被观察者
4public 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}
1//现实的故事中,TT是一个被别人关注的对象
2
3//TT成了被观察者
4public 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//观察者抽象
2public interface IObserver
3{ //观察TT
4 void ObserveTT(object sender,EventArgs e);
5}
6
7//观察TT的LG
8public 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
26public 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
44public 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
63public 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
1//观察者抽象
2public interface IObserver
3{ //观察TT
4 void ObserveTT(object sender,EventArgs e);
5}
6
7//观察TT的LG
8public 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
26public 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
44public 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
63public 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//程序入口
2public 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}
1//程序入口
2public 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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此声明,且在文章页面给出原文连接,否则保留追究法律责任的权利。