题目描述:C#编程实现猫叫时,老鼠逃跑,主人被惊醒。要求具有联动性和扩展性。
1. 观察者模式结构图
观察者模式定义了一种一对多的依赖关系,让多个观察者同时监视某一个主题对象。这个对象主题状态发生改变时,会通知所有观察者对象,是它们能自动更新自己。
2. C# 类图
3. 程序代码
IObserver.cs
namespace ObserverPattern
{
public interface IObserver
{
void Response();
}
}
ISubject.cs
namespace ObserverPattern { public interface ISubject { void Notify(); } }
Cat.cs
using System;
namespace ObserverPattern
{
public delegate void EventHandler();
public class Cat :ISubject
{
public event EventHandler cry;
private string name = "";
public Cat(string name)
{
this.name = name;
}
#region ISubject Members
public void Notify()
{
Console.WriteLine("Cat cry!");
if (cry != null)
cry();
}
#endregion
}
}
Master.cs
using System; namespace ObserverPattern { public class Master :IObserver { private string name = ""; private ISubject cat = null; /// <summary> /// construct Master /// </summary> /// <param name="name"></param> /// <param name="sub"></param> public Master(string name, ISubject sub) { this.name = name; this.cat = sub; } private void WakeUp() { Console.WriteLine(name + " wake up!"); } #region IObserver Members public void Response() { WakeUp(); } #endregion } }
Mouse.cs
using System; namespace ObserverPattern { public class Mouse : IObserver { private string name = ""; private ISubject iSubj = null; /// <summary> /// Mouse constructor /// </summary> /// <param name="name">name of mouse</param> /// <param name="sub">cat object</param> public Mouse(string name, ISubject sub) { this.name = name; this.iSubj = sub; } private void Escape() { Console.WriteLine(name + " begin to escape!"); } #region IObserver Members public void Response() { Escape(); } #endregion } }
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ObserverPattern
{
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat("Tom");
Mouse mouse = new Mouse("Jerry", cat);
Master master = new Master("Master", cat);
cat.cry += new EventHandler(mouse.Response);
cat.cry += new EventHandler(master.Response);
cat.Notify();
}
}
}
4. 运行结果: