观察者模式:由于一种行为的发生,而引起或牵扯多种未知行为的发生,为了解除各行为对象之间的耦合,所以产生的一种模式。如:天天应用的事件就是一种观察者模式
比如我们的场景:老板回来了(一种行为) 前台妍妍赶紧关闭了电视剧,财务小妍也赶紧关闭了购物网站,运营小明停止了王者农药,开发小张也睡醒了。(多种行为)
我们现在用普通方式来实现:
/// <summary>
/// 前台
/// </summary>
public class Reception
{
public void LookTvSeries()
{
Console.WriteLine(" 妍妍开始看电视剧");
}
public void CloseLookTvSeries()
{
Console.WriteLine(" 妍妍关闭了电视剧");
}
} /// <summary>
/// 财务
/// </summary>
public class Finance
{
public void ShopTaoBao()
{
Console.WriteLine(" 小妍开始逛淘宝");
}
public void CloseShopTaoBao()
{
Console.WriteLine(" 小妍停止了逛淘宝");
}
}
/// <summary>
/// 运营
/// </summary>
public class Operate
{
public void PlayGame()
{
Console.WriteLine(" 小明开始玩王者农药");
}
public void StopPlayGame()
{
Console.WriteLine(" 小明停止玩王者农药");
}
}
/// <summary>
/// 开发
/// </summary>
public class Develop
{
public void Sleep()
{
Console.WriteLine(" 小张睡着了");
}
public void StopSleep()
{
Console.WriteLine(" 小张睡醒了");
}
}
public class Boss
{
public void Coming()
{
Console.WriteLine(" 老板回来了!!!");
new Reception().CloseLookTvSeries();
new Finance().CloseShopTaoBao();
new Operate().StopPlayGame();
new Develop().StopSleep();
}
}
class Program
{
static void Main(string[] args)
{
new Boss().Coming();
Console.Read();
}
}输出结果:
Boss类拥有了其他4个类,程序耦合 不利于维护,还有可能妍妍没看电视剧,小张没睡觉。那么程序应该抽象。用观察者模式来实现
增加IObserver
public interface IObserver
{
void Action();
}
/// <summary>
/// 前台
/// </summary>
public class Reception: IObserver
{
public void LookTvSeries()
{
Console.WriteLine(" 妍妍开始看电视剧");
}
public void CloseLookTvSeries()
{
Console.WriteLine(" 妍妍关闭了电视剧");
}
public void Action()
{
CloseLookTvSeries();
}
}
/// <summary>
/// 财务
/// </summary>
public class Finance: IObserver
{
public void ShopTaoBao()
{
Console.WriteLine(" 小妍开始逛淘宝");
}
public void CloseShopTaoBao()
{
Console.WriteLine(" 小妍停止了逛淘宝");
}
public void Action()
{
CloseShopTaoBao();
}
}
/// <summary>
/// 运营
/// </summary>
public class Operate:IObserver
{
public void PlayGame()
{
Console.WriteLine(" 小明开始玩王者农药");
}
public void StopPlayGame()
{
Console.WriteLine(" 小明停止玩王者农药");
}
public void Action()
{
StopPlayGame();
}
}
/// <summary>
/// 开发
/// </summary>
public class Develop:IObserver
{
public void Sleep()
{
Console.WriteLine(" 小张睡着了");
}
public void StopSleep()
{
Console.WriteLine(" 小张睡醒了");
}
public void Action()
{
StopSleep();
}
}
public class Boss
{
private readonly List<IObserver> _observers = new List<IObserver>();
public void Coming()
{
Console.WriteLine(" 老板回来了!!!");
foreach (var observer in _observers)
{
observer.Action();
}
//new Reception().CloseLookTvSeries();
//new Finance().CloseShopTaoBao();
//new Operate().StopPlayGame();
//new Develop().StopSleep();
}
public void AddObervers(IObserver observer)
{
_observers.Add(observer);
}
}
class Program
{
static void Main(string[] args)
{
Boss boss = new Boss();
Reception reception = new Reception();
reception.LookTvSeries();
boss.AddObervers(reception);
Finance finance = new Finance();
finance.ShopTaoBao();
boss.AddObervers(finance);
Operate operate = new Operate();
operate.PlayGame();
boss.AddObervers(operate);
Develop develop = new Develop();
develop.Sleep();
boss.AddObervers(develop);
boss.Coming();
Console.Read();
}
}当小明没玩游戏,就不需要加入到observers
这个示例只是为了展示观察者模式,实际使用中可以用event更方便的解决
本文出自 “myself” 博客,请务必保留此出处http://ccandzy.blog.51cto.com/13163569/1979297
原文:http://ccandzy.blog.51cto.com/13163569/1979297