观察者模式

举例阐述:游戏情节,一颗小男孩,丢到众多鬼子附近,爆炸啦,根据炸弹的威力计算爆炸后鬼子的血量,假定有些鬼子有防具,有些鬼子没有防具。

分析:这种情况,使用观察者模式是比较理想的,因为观察者模式的就是是处理对象间一对多的依赖关系的,当一个对象发生变化,其它依赖他的对象都要得到通知并更新。

定义:在观察者模式中,上述小男孩被称为主题,而小鬼子们就被称为观察者。

下面我用代码,把举例给演示出来。

定义观察者模式中的主题。

//炸弹
    public class bomb
    { 
        //炸弹名称
        public  string Name;
        //炸弹攻击距离
        public  int Length;
        //炸弹攻击力
        public int ATK;
        //简单期间,这里炸弹我只有一颗啦。
        public bomb()
        {
            Name = "小男孩";
            Length = 100;
            ATK = 1000;
        }

        public DeBeng debeng;

        //爆炸
        public void beng()
        {
            if (debeng != null)
            {
                debeng(this);
            }
        }
    }
   
    //定义委托,为啦添加爆炸影响的路人
    public delegate void DeBeng(bomb bomb);

定义观察者模式中的观察者

//观察者,路人
    public class roadPeople
    { 
        //离炸弹距离
        public  int Length;
        //路人名称
        public  string Name;
        //血量
        public int LifeLength;
        //盾抵抗力
        public int ShieldLth;
        /// <summary>
        /// 初始化路人
        /// </summary>
        /// <param name="name">名称</param>
        /// <param name="lgth">炸弹距离</param>
        /// <param name="llth">生命值</param>
        /// <param name="sth">抵抗能力</param>
        public roadPeople(string name, int lgth,int llth,int sth)
        {
            Length = lgth;
            Name = name;
            LifeLength = llth;
            ShieldLth = sth;
        }
        //被炸,这里的处理方法我写一致啦,其实可以是根据不同的柜子有不一样的处理方式,这样就展示啦观察者模式的强大,我这里为啦简便起见,就没有定义那么多类
        public void Beated(bomb bom)   
        {
            //盾削去攻击
            int th=this.ShieldLth-bom.ATK;
            //被炸后,血量情况
            string info="";
            if (th > 0)
            { 
                //盾牛逼,不掉血
                info = "我是:" + this.Name + "。我的盾更牛逼不掉血" ;               
            }
            else
            {
                //掉血
                int h=th+this.LifeLength;
                //判断死亡
                if (h>0)
                {
                    //未死
                    info = "我是:" + this.Name + "。掉血:" + (-th)+"点。";
                }
                else
                {
                    //已死
                    info = "我是:" + this.Name + "。最后一句话,但愿苍老师随我而去!";
                }
            }
            Console.WriteLine("啊,哦,额,噗,我靠,牛逼。"+ info);
        }
    }

使用主题与观察者

static void Main()
        {
           //路人集合
            List<roadPeople> list = new List<roadPeople>() { 
           //路人甲,距离炸弹10米,血量100,带1级盾
            new roadPeople("路人甲",40,100,1),
            //路人乙,距离炸弹20米,血量1000,带10级盾
            new roadPeople("路人乙",40,100,4000),
            new roadPeople("路人丙",50,2000,50),
            new roadPeople("路人丁",1000,30,1)         
           };

            //实例化炸弹
            bomb bom = new bomb();
            //添加能炸到的路人
            foreach(roadPeople rp in list)
            {
                if ((bom.Length - rp.Length) > 0)
                {
                    bom.debeng += new DeBeng(rp.Beated);                    
                }
            }
            //炸弹爆炸
            bom.beng();
            Console.ReadLine();
        }

简单阐述构建使用观察者模式过程:主题可变更做为参数,观察者拥有自己的属性与同样签名的响应方法,把各个观察者对象的被炸方法添加到事件中,然后把主题对象作为参数传递给事件中,这样就能根据观察者各自的属性,与计算方法来获取通知更新。

观察者模式的效果:观察者促进啦主体的抽象耦合。主体不知道观察者的细节,观察者可根据自身的属性功能来对主题的通知做变更。然而观察者也有自己的缺点,就是当主题发生一系列的变化事,观察者都要做批量的更新,如果这样的更新成本很高,那么解决方法就是根据种类需求通知,而不能盲目的通知所有的观察者。

原文地址:https://www.cnblogs.com/zhaojinhui/p/5508955.html