观察者模式——定义了对象之间的一对多依赖,这样一来,当一个对像改变状态时,它的所有依赖者都会收到通知并自动更新。(摘自《Head First Design Patterns》) 以下是自已用VS画了一个简图:
首先创建司令官和小队的接口:
/// <summary>
/// 主题对象
/// </summary>
public interface ISubject
{
List<IObserver> Observers
{
get;
set;
}
void RegisterObserver(IObserver observer);
void RemoveObserver(IObserver observer);
void NotifyObservers(string command);
}
/// <summary>
/// 观察者
/// </summary>
public interface IObserver
{
void Update(string command);
}
实现一个司令官(当然你也可以实现多个): /// <summary>
/// 司令官
/// </summary>
public class Commander : ISubject
{
#region ISubject 成员
private List<IObserver> _observers;
public List<IObserver> Observers
{
get
{
return _observers;
}
set
{
_observers = value;
}
}
public Commander()
{
_observers = new List<IObserver>();
}
public void RegisterObserver(IObserver observer)
{
this.Observers.Add(observer);
}
public void RemoveObserver(IObserver observer)
{
this.Observers.Remove(observer);
}
public void NotifyObservers(string command)
{
foreach (IObserver observer in this.Observers)
{
observer.Update(command);
}
}
#endregion
public void SetCommand(string command)
{
Console.WriteLine(string.Format("司令官下命令:{0}", command));
NotifyObservers(command);
}
}
实现三个小队: /// <summary>
/// 斧头小队
/// </summary>
public class AxeTeam : IObserver
{
#region IObserver 成员
public void Update(string command)
{
switch (command)
{
case "攻击":
Console.WriteLine("斧头小队:用斧头攻击,势死如归!");
break;
case "撤退":
Console.WriteLine("斧头小队:坚守阵地,死也不放弃!");
break;
}
}
#endregion
}
/// <summary>
/// 弓箭手小队
/// </summary>
public class BowAndArrowTeam : IObserver
{
#region IObserver 成员
public void Update(string command)
{
switch (command)
{
case "攻击":
Console.WriteLine("弓箭手小队:弓箭手掩护,退后十步,射箭!");
break;
case "撤退":
Console.WriteLine("弓箭手小队:边撤退,边掩护斧头小队!");
break;
}
}
#endregion
}
/// <summary>
/// 匕首小队
/// </summary>
public class KnifeTeam : IObserver
{
#region IObserver 成员
public void Update(string command)
{
switch (command)
{
case "攻击":
Console.WriteLine("匕首小队:匕首攻击,打不过就跑!");
break;
case "撤退":
Console.WriteLine("匕首小队:快撤啊,我军大势已去!");
break;
}
}
#endregion
}
最后我们开始使用它用: //实例化司令官和三个小队
Commander commander = new Commander();
AxeTeam axe = new AxeTeam();
BowAndArrowTeam baa = new BowAndArrowTeam();
KnifeTeam knife = new KnifeTeam();
//注册观察者
commander.RegisterObserver(axe);
commander.RegisterObserver(baa);
commander.RegisterObserver(knife);
//司令官下命令
commander.SetCommand("攻击");
commander.SetCommand("撤退");
//匕首小队怕死,从军队中删除
commander.RemoveObserver(knife);
//司令官再次下命令
commander.SetCommand("攻击");
commander.SetCommand("撤退");
输出的结果是:
司令官下命令:攻击
斧头小队:用斧头攻击,势死如归!
弓箭手小队:弓箭手掩护,退后十步,射箭!
匕首小队:匕首攻击,打不过就跑!
司令官下命令:撤退
斧头小队:坚守阵地,死也不放弃!
弓箭手小队:边撤退,边掩护斧头小队!
匕首小队:快撤啊,我军大势已去!
司令官下命令:攻击
斧头小队:用斧头攻击,势死如归!
弓箭手小队:弓箭手掩护,退后十步,射箭!
司令官下命令:撤退
斧头小队:坚守阵地,死也不放弃!
弓箭手小队:边撤退,边掩护斧头小队!
一个简单的观察者模式就介绍完毕,当然里面那些传递命令还用了一些SWITCH,有人会说这可以重构啊。本文意在介绍观察者模式,那些只不过是内容而已,在以后的模式中会用一个新的模式重新设计这一块。 本文意求用最简单的代码表达模式思想,有不足之处还请多提意见,匆怪,呵呵。