观察者模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。
观察者模式:由于一种行为的发生,而引起或牵扯多种未知行为的发生,为了解除各行为对象之间的耦合,所以产生的一种模式。如:天天应用的事件就是一种观察者模式
比如我们的场景:老板回来了(一种行为) 前台妍妍赶紧关闭了电视剧,财务小妍也赶紧关闭了购物网站,运营小明停止了王者农药,开发小张也睡醒了。(多种行为)
我们现在用普通方式来实现:
/// <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
以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章
Java设计模式补充:回调模式事件监听器模式观察者模式(转)