• 观察者模式


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

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

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

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

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

    //炸弹
        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();
            }

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

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

  • 相关阅读:
    美团这个项目是用来干啥的?
    基于C#的机器学习--面部和动态检测-图像过滤器
    基于C#的机器学习--颜色混合-自组织映射和弹性神经网络
    EF Core For Oracle11中Find FirstOrDefault等方法执行失败
    使用DataContractJsonSerializer发序列化对象时出现的异常
    数据库空值排序
    C#浅拷贝与深拷贝测试
    C#排序算法的实现---快速排序
    C#排序算法的实现---选择排序
    C#排序算法的实现---冒泡排序
  • 原文地址:https://www.cnblogs.com/zhaojinhui/p/5508955.html
Copyright © 2020-2023  润新知