公元
2054
年
,
第
30
界世界杯亚洲区外围赛中,中国队的最后一场比赛对韩国
,
只有战胜对手才能出线。 自从米卢执教中国队以来
,
已经有五十多年中国队再也没尝到过进军世界杯的滋味,而且恐韩症已经染了七十年之久.很多球迷从黑发人看成了白发人,但是还有部分的痴心球迷关注着这场比赛.
痴心球迷
class Audience
{
private string name;
public Audience(string name)
{
this.name = name;
}
public void nervous()
{
Console.WriteLine(name + " is nervous");
}
public void Excited()
{
Console.WriteLine(name + " is excited");
}
public void KnowResult(bool isWin)
{
if (isWin)
{
Console.WriteLine(name + " jump happily");
}
else
{
Console.WriteLine(name + " push the tv");
}
}
}
足球比赛
class FootballMatch
{
private IList<Audience> observers = new List<Audience>();
public IList<Audience> Observers
{
get { return observers; }
}
public void Play()
{
foreach (Audience audience in observers)
{
audience.Excited();
}
Console.WriteLine("Match Begin");
Console.WriteLine("Match End");
}
}
static
void
Main(
string
[] args)
{
FootballMatch match
=
new
FootballMatch();
Audience justin
=
new
Audience(
"
justin
"
);
Audience terry
=
new
Audience(
"
terry
"
);
match.Observers.Add(justin);
match.Observers.Add(terry);
match.Play();
}
足球比赛中可能不只球员,还有天气,裁判等各要素,需要让足球比赛和它的观察者们偶合度更小,我们尝试着用委托和事件来重构它.
足球比赛
public delegate void MatchHandler();
public delegate void MatchHandlerEnd(bool isWin);
class FootballMatch
{
public event MatchHandler BeforeMatch;
public event MatchHandlerEnd AfterMatch;
public void Play()
{
if (BeforeMatch != null)
{
BeforeMatch();
}
Console.WriteLine("Match Begin");
Console.WriteLine("Match End");
Console.WriteLine("China win? (Y/N)");
string win = Console.ReadLine();
bool isWin = true;
if (win.ToLower() != "y")
{
isWin = false;
}
if (AfterMatch != null)
{
AfterMatch(isWin);
}
}
}
任何关注足球比赛的人或者事都可以通过注册事件的方式来关注它,偶合度更加松散,意味着更加灵活,这不正是ISP(接口隔离原则)所提倡的嘛:一个类对另外一个类的依赖性应当是建立在最小接口上的。下面代码中不但有足球比赛中的观众,还有天气.
static
void
Main(
string
[] args)
{
FootballMatch match
=
new
FootballMatch();
Audience justin
=
new
Audience(
"
justin
"
);
Audience terry
=
new
Audience(
"
terry
"
);
match.BeforeMatch
+=
new
MatchHandler(match_BeforeMatch);
match.BeforeMatch
+=
new
MatchHandler(justin.Excited);
match.BeforeMatch
+=
new
MatchHandler(terry.nervous);
match.AfterMatch
+=
new
MatchHandlerEnd(justin.KnowResult);
match.AfterMatch
+=
new
MatchHandlerEnd(terry.KnowResult);
match.AfterMatch
+=
new
MatchHandlerEnd(match_AfterMatch);
match.Play();
}
static
void
match_AfterMatch(
bool
isWin)
{
if
(isWin)
{
Console.WriteLine(
"
Snow..
"
);
}
else
{
Console.WriteLine(
"
Rain..
"
);
}
}
static
void
match_BeforeMatch()
{
Console.WriteLine(
"
wind.
"
);
}
通过带参数的委托可以实现中国队赢球或输球后不同的结果.
当中国队输球了,愤怒的观众把电视机砸了,天空也开始下雨了.
你也可以任意添加观察者到这场足球比赛里,只要符合所定义委托的规定就行.
僵化的代码需要重构,落后的中国足球体制是不是也需要重构呢?