观察者模式是一种行为型设计模式,主要为了实现方法和对象的分离。本例模拟了下雨后不同角色的反应。在例子中,天气作为被观察对象,继承自IObject接口,农民、诗人和行人作为观察者都继承自IObserver接口。农民、诗人和行人的不同反应都是由下雨这件事情引起的。示例代码如下,本人水平有限,理解不当的地方不要笑话我! ^_^
namespace Observer.Demo
{
/// <summary>
/// 声明一个观察对象接口,定义观察者注册方法和观察对象发生变化的方法
/// </summary>
public interface IObject
{
/// <summary>
/// 观察者注册方法
/// </summary>
/// <param name="observer">观察者</param>
void AddObserveObject(IObserver observer);
/// <summary>
/// 观察对象发生变化时的方法
/// </summary>
void Invoke();
}
}
namespace Observer.Demo
{
/// <summary>
/// 声明一个观察者接口,定义观察对象发生变化时自身的回应方法
/// </summary>
public interface IObserver
{
/// <summary>
/// 观察对象发生变化时,观察者的回应方法
/// </summary>
void Response();
}
}
namespace Observer.Demo
{
/// <summary>
/// 天气类,是所有观察者的观察对象,继承自IObject接口
/// </summary>
public class Weather : IObject
{
private List<IObserver> _observers = null;
public Weather()
{
_observers = new List<IObserver>();
}
/// <summary>
/// 观察者注册方法
/// </summary>
/// <param name="observer">观察者</param>
public void AddObserveObject(IObserver observer)
{
this._observers.Add(observer);
}
/// <summary>
/// 观察对象发生变化时的方法
/// </summary>
public void Invoke()
{
Console.WriteLine("天气:淅沥淅沥的小雨开始下起来了,不知道大家都在忙什么?");
Console.WriteLine("--------------------------------------------------------");
foreach (var item in _observers)
{
item.Response();
}
}
}
}
namespace Observer.Demo
{
public class Farmer : IObserver
{
/// <summary>
/// 农民类
/// </summary>
public void Response()
{
Console.WriteLine("农民:我要种庄稼了,不要辜负了这春雨!");
}
}
}
namespace Observer.Demo
{
/// <summary>
/// 诗人类
/// </summary>
public class Poet : IObserver
{
public void Response()
{
Console.WriteLine("诗人:春雨贵如油啊,我要把它写到诗词里!");
}
}
}
namespace Observer.Demo
{
public class Walker : IObserver
{
/// <summary>
/// 行人类
/// </summary>
public void Response()
{
Console.WriteLine("行人:这雨下的真不是时候,我要打上伞,不然要被淋湿了!");
}
}
}
namespace Observer.Demo
{
class Program
{
static void Main(string[] args)
{
//实例化观察对象
IObject weather = new Weather();
//实例化观察者对象
IObserver farmer = new Farmer();
IObserver poet = new Poet();
IObserver walker = new Walker();
//注册观察者
weather.AddObserveObject(farmer);
weather.AddObserveObject(poet);
weather.AddObserveObject(walker);
//观察对象发生变化
weather.Invoke();
Console.ReadLine();
}
}
}