您的位置:首页 > 其它

观察者模式

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

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

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

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

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

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


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

观察者模式的效果:观察者促进啦主体的抽象耦合。主体不知道观察者的细节,观察者可根据自身的属性功能来对主题的通知做变更。然而观察者也有自己的缺点,就是当主题发生一系列的变化事,观察者都要做批量的更新,如果这样的更新成本很高,那么解决方法就是根据种类需求通知,而不能盲目的通知所有的观察者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: