举例阐述:游戏情节,一颗小男孩,丢到众多鬼子附近,爆炸啦,根据炸弹的威力计算爆炸后鬼子的血量,假定有些鬼子有防具,有些鬼子没有防具。
分析:这种情况,使用观察者模式是比较理想的,因为观察者模式的就是是处理对象间一对多的依赖关系的,当一个对象发生变化,其它依赖他的对象都要得到通知并更新。
定义:在观察者模式中,上述小男孩被称为主题,而小鬼子们就被称为观察者。
下面我用代码,把举例给演示出来。
定义观察者模式中的主题。
//炸弹 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(); }
简单阐述构建使用观察者模式过程:主题可变更做为参数,观察者拥有自己的属性与同样签名的响应方法,把各个观察者对象的被炸方法添加到事件中,然后把主题对象作为参数传递给事件中,这样就能根据观察者各自的属性,与计算方法来获取通知更新。
观察者模式的效果:观察者促进啦主体的抽象耦合。主体不知道观察者的细节,观察者可根据自身的属性功能来对主题的通知做变更。然而观察者也有自己的缺点,就是当主题发生一系列的变化事,观察者都要做批量的更新,如果这样的更新成本很高,那么解决方法就是根据种类需求通知,而不能盲目的通知所有的观察者。