CSDN帖子:http://community.csdn.net/Expert/topic/3839/3839240.xml?temp=.6079377.
程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
要求:
1.要有联动性,老鼠和主人的行为是被动的。
2.考虑可扩展性,猫的叫声可能引起其它联动效应
大部分答案都是使用的事件编程,我这里换了一下思路,使用观察着模式,用接口也实现了,因为考虑到第二个要求,即猫大叫也可能直接导致主人惊醒,所以Man也继承了ICatCatcher接口
1
using System;
2
using System.Collections;
3![](/Images/OutliningIndicators/None.gif)
4
namespace test
5
{
6![](/Images/OutliningIndicators/InBlock.gif)
7
public interface ICatCatcher
8
{
9
void DoSth();
10
}
11![](/Images/OutliningIndicators/InBlock.gif)
12
public interface ICatSubject
13
{
14
void RegesiterCatCatcher(ICatCatcher catCatcher);
15
void Miao();
16
}
17![](/Images/OutliningIndicators/InBlock.gif)
18
public interface IRatSubject
19
{
20
void RegesiterRatCatcher(IRatCatcher ratCatcher);
21
void Run();
22
}
23![](/Images/OutliningIndicators/InBlock.gif)
24
public interface IRatCatcher
25
{
26
void Wake();
27
}
28![](/Images/OutliningIndicators/InBlock.gif)
29
public class Cat:ICatSubject
30
{
31
public Cat()
32
{
33
}
34
35
private ArrayList catcherList = new ArrayList();
36
public void RegesiterCatCatcher(ICatCatcher catcher)
37
{
38
catcherList.Add( catcher );
39
}
40![](/Images/OutliningIndicators/InBlock.gif)
41
public void Miao()
42
{
43
Console.WriteLine( "Miao" );
44![](/Images/OutliningIndicators/InBlock.gif)
45
for(int i=0;i<catcherList.Count;i++)
46
{
47
ICatCatcher catCatcher = (ICatCatcher)catcherList[i];
48
catCatcher.DoSth();
49
}
50
}
51![](/Images/OutliningIndicators/InBlock.gif)
52
[STAThread]
53
public static void Main()
54
{
55
Cat cat = new Cat();
56
57
Rat[] rat = new Rat[10];
58
for( int i=0;i<10;i++)
59
{
60
rat[i] = new Rat(cat);
61
}
62![](/Images/OutliningIndicators/InBlock.gif)
63
Man man = new Man(rat,cat);
64![](/Images/OutliningIndicators/InBlock.gif)
65
cat.Miao();
66
}
67
}
68![](/Images/OutliningIndicators/InBlock.gif)
69
public class Rat:ICatCatcher,IRatSubject
70
{
71
public Rat(ICatSubject catSub)
72
{
73
catSub.RegesiterCatCatcher(this);
74
}
75![](/Images/OutliningIndicators/InBlock.gif)
76
public void DoSth()
77
{
78
Run();
79
}
80
81
private ArrayList ratcherList = new ArrayList();
82
public void RegesiterRatCatcher(IRatCatcher catcher)
83
{
84
ratcherList.Add( catcher );
85
}
86![](/Images/OutliningIndicators/InBlock.gif)
87
public void Run()
88
{
89
Console.WriteLine("Rat Run");
90
for(int i=0;i<ratcherList.Count;i++)
91
{
92
IRatCatcher ratCatcher = (IRatCatcher)ratcherList[i];
93
ratCatcher.Wake();
94
}
95
}
96
}
97![](/Images/OutliningIndicators/InBlock.gif)
98
public class Man:ICatCatcher,IRatCatcher
99
{
100
public Man(IRatSubject[] ratSub,ICatSubject catSub)
101
{
102
for( int i=0 ;i<ratSub.Length;i++)
103
{
104
ratSub[i].RegesiterRatCatcher(this);
105
}
106
catSub.RegesiterCatCatcher(this);
107
}
108![](/Images/OutliningIndicators/InBlock.gif)
109
public void DoSth()
110
{
111
Console.WriteLine( "Cat bring on Wake" );
112
}
113
114
public void Wake()
115
{
116
Console.WriteLine( "Rats bring on Wake" );
117
}
118
}
119
}
120![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/None.gif)
5
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
33
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
34
![](/Images/OutliningIndicators/InBlock.gif)
35
![](/Images/OutliningIndicators/InBlock.gif)
36
![](/Images/OutliningIndicators/InBlock.gif)
37
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
50
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/InBlock.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
62
![](/Images/OutliningIndicators/InBlock.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/InBlock.gif)
66
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
67
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
73
![](/Images/OutliningIndicators/InBlock.gif)
74
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
75
![](/Images/OutliningIndicators/InBlock.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
80
![](/Images/OutliningIndicators/InBlock.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
95
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
96
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/InBlock.gif)
115
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
116
![](/Images/OutliningIndicators/InBlock.gif)
117
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
118
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
119
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
120
![](/Images/OutliningIndicators/None.gif)
这里如果调试会出现一点点小问题,就是老鼠有很多,每个老鼠的Run都会Wake一下Man,所以感觉是主人被多次惊醒,其实这只是因为计算机总是按照顺序来执行程序的,能够模拟到这种效果应该已经算符合题意了