昨天我们讲到人族毫无准备的情况下被神族空降金甲虫偷袭了一把,损失惨重,于是人族高层召开会议,总结教训,商讨应对方法,经过商讨,决定在各处设置警报点,并且给该警报点警卫一份名单,要求一旦警报点发出警报时,警卫立即通知名单上的所有部队!而且随着不同局势的变化,可以对名单上的成员进行修改!这一系列部署程序上称为抽象主题。符合这一主题的警报点有很多,比如位置a点的防空塔,这个防空塔程序上称为具体主题,此时要求所有部队,一旦接到警报通知,马上作出防御或还击,没有接到通知的就各干各的事,在程序里就是定义了一个接口或抽象类,制定了一条对警报作出反应的规定,我们称为抽象观察者,a点防空塔的警卫将符合这条规定的4部分人马:scv,坦克1队,坦克2对,隐形战机加入了通知名单(他们都来自不同的类,但都属于抽象观察者的之类,符合接口,能对警报作出反应),只要发生警报就通知者4部分人马!程序里我们称这4部分人马为具体观察者。这样就可以以不变应万变! 下面看看类图 using System; using System.Collections; namespace starcraft.ObserverPattern { //------------抽象主题角色------------ abstract class Alarm //警报,警报的抽象定义 { protected string alarmsignal=""; //代表警报器的状态,通常状况下无信号! protected string place; //发生警报的位置; private ArrayList Armys = new ArrayList(); //发生警报时要通知作出反应的部队列表 public Alarm(string where) //事例化一个警报,代表在某地方设置警报监视器 { this.place = where; } public void Add(ITerranArmy army) //将某一个部队加入通知列表,可以是坦克,战机…… { Armys.Add(army); } public void Remove(ITerranArmy army) //将某一个部队从通知列表中移出 { Armys.Remove(army); } public void Notify() //将警报发给所有要通知的部队,他们将作出相应行动! { foreach (ITerranArmy Army in Armys) Army.Forestall(this); } public string Alarmsignal { get { return alarmsignal; } set { alarmsignal = value; Notify(); //当警报器状态发生警报时,发出警报通知 } } public string Place { get { return place; } set { place = value; } } } //------------具体主题角色------------ class MissileTurret : Alarm //一个具体的警报,防空塔警报 { public MissileTurret(string where): base(where) { } } //------------抽象观察者角色------------ interface ITerranArmy //一个抽象的人族部队 { void Forestall(Alarm larum); //当接到某一种警报是作出相应行动来应对警报! } //------------3类具体观察者角色------------ class TankArmy : ITerranArmy //坦克部队,一个具体的人族部队 { private String name ; //部队名 private String state = "在路口巡逻"; //正常时,坦克部队的状态; public void Forestall(Alarm larum) //当接到通知后改变状态,前往警报地点 { this.state = "到达" + larum.Place + ",展开,准备开火"; Console.WriteLine(this.Name + ":" + this.State); //将状态输出 } public string Name { get { return name; } set { name = value; } } public string State { get { return state; } set { state = value; } } public TankArmy(string name) { this.name = name; } } class WraithArmy : ITerranArmy //幽灵战机部队,一个具体的人族部队 { private String name; //部队名 private String state = "在前线待命"; //正常时,战机部队的状态; public void Forestall(Alarm larum) //当接到通知后改变状态,前往警报地点 { this.state = "飞往" + larum.Place + ",隐形,准备开火"; Console.WriteLine(this.Name + ":" + this.State); //将状态输出 } public string Name { get { return name; } set { name = value; } } public string State { get { return state; } set { state = value; } } public WraithArmy(string name) { this.name = name; } } class SCV : ITerranArmy //采矿农民,一个具体的人族部队 { private String name; //部队名 private String state = "采矿"; //正常时,战机部队的状态; public void Forestall(Alarm larum) //当接到通知后改变状态,远离警报地点 { this.state = "远离" + larum.Place + ",到达安全地区"; Console.WriteLine(this.Name + ":" + this.State); //将状态输出 } public string Name { get { return name; } set { name = value; } } public string State { get { return state; } set { state = value; } } public SCV(string name) { this.name = name; } } //---------------------------------------- class game //具体游戏情景 { static void Main(string[] args) { Alarm alarm = new MissileTurret("A点"); //在A点设置一个警报器; //分别实例化4个人族部队作为我们的观察对象,并记录各个部队的状态,方便大家进行前后对比 SCV scv = new SCV("SCV"); TankArmy tank1 = new TankArmy("坦克部队1"); TankArmy tank2 = new TankArmy("坦克部队2"); WraithArmy wraith = new WraithArmy("隐形战机"); Console.WriteLine("-----正常状态下各个部队的状态"); Console.WriteLine(scv.Name + ":" + scv.State); Console.WriteLine(tank1.Name + ":" + tank1.State); Console.WriteLine(tank2.Name + ":" + tank2.State); Console.WriteLine(wraith.Name + ":" + wraith.State); //将这4个对象加入到警报通知列表; alarm.Add(scv); alarm.Add(tank1); alarm.Add(tank2); alarm.Add(wraith); Console.WriteLine("-----在A点设置的警报器发生了警报信号"); alarm.Alarmsignal = "发现神族运输机"; //防空塔发现了神族运输机,状态改变; //大家仔细看看这一步,随着防空塔状态的改变,以上几个部队的状态都改变了! Console.WriteLine("-----人族部队未损失一兵一卒,击落来侵犯的所有敌军!"); } }} 运行结果: 经过一来一回两次交锋,双方互有胜负,战成平手!局面进入僵持阶段!那么随着游戏的发展人族是如何把握战局,占据主动,迎来最后的胜利,我们慢慢说来! 转载于:https://www.cnblogs.com/dircmpt/archive/2006/12/06/583699.html