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

4
//被观察者的抽象5
public interface ISubject6


{7
//添加观察者动作8
void AttachReaction(Reaction reaction);9
10
//减去观察者动作11
void DetachReaction(Reaction reaction);12
13
//被观察者哭了14
void Cry();15
}
1
//现实的故事中,TT是一个被别人关注的对象2

3
//TT成了被观察者4
public class TT:ISubject5


{ 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的朋友们,也就是观察者了
1
//观察者抽象2
public interface IObserver3


{ //观察TT4
void ObserveTT(object sender,EventArgs e);5
}6

7
//观察TT的LG8
public class LG:IObserver9


{10
private string name;11
//构造器12
public LG(string name)13

{14
this.name=name;15
}16
17
//观察TT18
public void ObserveTT(object sender,EventArgs e)19

{20
Console.WriteLine("{0}:极其难受",name);21
Console.WriteLine();22
}23
}24

25
//观察TT的HXQ26
public class HXQ:IObserver27


{28
private string name;29
//构造器30
public HXQ(string name)31

{32
this.name=name;33
}34
35
//观察TT36
public void ObserveTT(object sender,EventArgs e)37

{38
Console.WriteLine("{0}:好难受",name);39
Console.WriteLine();40
}41
}42

43
//观察TT的LFN44
public class LFN:IObserver45


{46
private string name;47
//构造器48
public LFN(string name)49

{50
this.name=name;51
}52
53
//观察TT54
public void ObserveTT(object sender,EventArgs e)55

{56
Console.WriteLine("{0}:难受",name);57
Console.WriteLine();58
}59
}60

61

62
//观察TT的JH63
public class JH:IObserver64


{65
private string name;66
//构造器67
public JH(string name)68

{69
this.name=name;70
}71
72
//观察TT73
public void ObserveTT(object sender,EventArgs e)74

{75
Console.WriteLine("{0}:难受",name);76
Console.WriteLine();77
}78
}79

1
//程序入口2
public class MyProgram3


{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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此声明,且在文章页面给出原文连接,否则保留追究法律责任的权利。
浙公网安备 33010602011771号