观察者模式 The Observer Pattern

        观察者模式——定义了对象之间的一对多依赖,这样一来,当一个对像改变状态时,它的所有依赖者都会收到通知并自动更新。(摘自《Head First Design Patterns》)        以下是自已用VS画了一个简图:               首先创建司令官和小队的接口:       
/// <summary>

    /// 主题对象

    /// </summary>

    public interface ISubject

    {

        List<IObserver> Observers

        {

            get;

            set;

        }

    

        void RegisterObserver(IObserver observer);



        void RemoveObserver(IObserver observer);



        void NotifyObservers(string command);

    }



/// <summary>

    /// 观察者

    /// </summary>

    public interface IObserver

    {

        void Update(string command);

    }
       实现一个司令官(当然你也可以实现多个):       
/// <summary>

    /// 司令官

    /// </summary>

    public class Commander : ISubject

    {

        #region ISubject 成员

        private List<IObserver> _observers;

        public List<IObserver> Observers

        {

            get

            {

                return _observers;

            }

            set

            {

                _observers = value;

            }

        }



        public Commander()

        {

            _observers = new List<IObserver>();

        }



        public void RegisterObserver(IObserver observer)

        {

            this.Observers.Add(observer);

        }



        public void RemoveObserver(IObserver observer)

        {

            this.Observers.Remove(observer);

        }



        public void NotifyObservers(string command)

        {

            foreach (IObserver observer in this.Observers)

            {

                observer.Update(command);

            }

        }



        #endregion



        public void SetCommand(string command)

        {

            Console.WriteLine(string.Format("司令官下命令:{0}", command));

            NotifyObservers(command);

        }

    }
       实现三个小队:       
/// <summary>

    /// 斧头小队

    /// </summary>

    public class AxeTeam : IObserver

    {

        #region IObserver 成员



        public void Update(string command)

        {

            switch (command)

            {

                case "攻击":

                    Console.WriteLine("斧头小队:用斧头攻击,势死如归!");

                    break;

                case "撤退":

                    Console.WriteLine("斧头小队:坚守阵地,死也不放弃!");

                    break;

            }

        }



        #endregion

    }



/// <summary>

    /// 弓箭手小队

    /// </summary>

    public class BowAndArrowTeam : IObserver

    {

        #region IObserver 成员



        public void Update(string command)

        {

            switch (command)

            {

                case "攻击":

                    Console.WriteLine("弓箭手小队:弓箭手掩护,退后十步,射箭!");

                    break;

                case "撤退":

                    Console.WriteLine("弓箭手小队:边撤退,边掩护斧头小队!");

                    break;

            }

        }



        #endregion

    }



/// <summary>

    /// 匕首小队

    /// </summary>

    public class KnifeTeam : IObserver

    {

        #region IObserver 成员



        public void Update(string command)

        {

            switch (command)

            {

                case "攻击":

                    Console.WriteLine("匕首小队:匕首攻击,打不过就跑!");

                    break;

                case "撤退":

                    Console.WriteLine("匕首小队:快撤啊,我军大势已去!");

                    break;

            }

        }



        #endregion

    }
       最后我们开始使用它用:       
//实例化司令官和三个小队

            Commander commander = new Commander();

            AxeTeam axe = new AxeTeam();

            BowAndArrowTeam baa = new BowAndArrowTeam();

            KnifeTeam knife = new KnifeTeam();



            //注册观察者

            commander.RegisterObserver(axe);

            commander.RegisterObserver(baa);

            commander.RegisterObserver(knife);

            //司令官下命令

            commander.SetCommand("攻击");

            commander.SetCommand("撤退");

            //匕首小队怕死,从军队中删除

            commander.RemoveObserver(knife);

            //司令官再次下命令

            commander.SetCommand("攻击");

            commander.SetCommand("撤退");
       输出的结果是:
       司令官下命令:攻击
          斧头小队:用斧头攻击,势死如归!
          弓箭手小队:弓箭手掩护,退后十步,射箭!
          匕首小队:匕首攻击,打不过就跑!
       司令官下命令:撤退
       斧头小队:坚守阵地,死也不放弃!
       弓箭手小队:边撤退,边掩护斧头小队!
       匕首小队:快撤啊,我军大势已去!
       司令官下命令:攻击
          斧头小队:用斧头攻击,势死如归!
          弓箭手小队:弓箭手掩护,退后十步,射箭!
       司令官下命令:撤退
       斧头小队:坚守阵地,死也不放弃!
       弓箭手小队:边撤退,边掩护斧头小队!
       一个简单的观察者模式就介绍完毕,当然里面那些传递命令还用了一些SWITCH,有人会说这可以重构啊。本文意在介绍观察者模式,那些只不过是内容而已,在以后的模式中会用一个新的模式重新设计这一块。        本文意求用最简单的代码表达模式思想,有不足之处还请多提意见,匆怪,呵呵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值