using System; using System.Collections.Generic; namespace ObserverPattern.SimpleImplement { /// /// 钓鱼工具抽象类 /// 用来维护订阅者列表,并通知订阅者 /// public abstract class FishingTool { private readonly List _subscribers; protected FishingTool() { _subscribers = new List(); } public void AddSubscriber(ISubscriber subscriber) { if (!_subscribers.Contains(subscriber)) _subscribers.Add(subscriber); } public void RemoveSubscriber(ISubscriber subscriber) { if (_subscribers.Contains(subscriber)) _subscribers.Remove(subscriber); } public void Notify(FishType type) { foreach (var subscriber in _subscribers) subscriber.Update(type); } } /// /// 鱼竿 /// public class FishingRod : FishingTool { public void Fishing() { Console.WriteLine("开始下钩!"); //用随机数模拟鱼咬钩,若随机数为偶数,则为鱼咬钩 if (new Random().Next() % 2 == 0) { var type = (FishType) new Random().Next(0, 5); Console.WriteLine("铃铛:叮叮叮,鱼儿咬钩了"); Notify(type); } } } /// /// 订阅者(观察者)接口 /// 由具体的订阅者实现Update()方法 /// public interface ISubscriber { void Update(FishType type); } /// /// 垂钓者实现观察者接口 /// public class FishingMan : ISubscriber { public FishingMan(string name) { Name = name; } public string Name { get; set; } public int FishCount { get; set; } public void Update(FishType type) { FishCount++; Console.WriteLine("{0}:钓到一条[{2}],已经钓到{1}条鱼了!", Name, FishCount, type); } } }