隨著變化而變化(Observer) (轉)

worldblog發表於2008-01-31
隨著變化而變化(Observer) (轉)[@more@]

 

對於很多事物.都在不斷變化.也就是說.在不斷變化的情況下.我們必須能夠得到其

相互關聯的之間的變化.也就是能夠通知到其他物件.但不同於牽一動百的情況

因為畢竟只是告訴相互關聯的物件與之對應的數值才發生變化.換句話就是某個物件

的狀態發生變化.於它相對應的一組物件將要隨著變化.這裡就引出了觀察者.通知者

的對應關係.觀察者發現變化.通知者就告訴每個與之相關的物件都發生相應的變化.

這也就是所謂的Observer.如同往常一樣我們還是從抽象物件開始

下面還是假設一種情況.假設你是個小學生.你的成績提高了10分.你的零用錢就增加

5%.並且父母對你的關愛程度提高3.相反就隨之減少.(這只是打個比方.)

//首先構造抽象類
abstract class Student{
  public string sName;
  public int Grade;
  public int LoveLevel;
  public int Money;

  portected IObserver ob;

  public Student(string n, int g, int l,int m){
  sName=n;
  Grade=g;
  LoveLevel=l;
  Money=m;
  }

  public void AddObserver (IObserver o){
  this.ob=o;
  this.ob.ObGrade=this.Grade;
  }
 
  public void RemoveObserver(){
  this.ob=null
  this.ob.ObGrade=-1;
  }
 
  public void Notify(){
  ob.Update();
  }

}

//實現學生物件(其實是為了擴充套件才這樣做的)
public class myStudent: Student{
  //如果你想可以加入你想要的東西
  public myStudent(string s,int g,int l,int m){base(s,g,l,m);}
}

下面我們就是要構造Observer物件了.考慮Observer物件應該做什麼?很顯然.就是

觀察學生的成績是否發生變化.並做出相應的處理.

interface  IObserver {
  Student student{get;set;};
  void Update();
}

//實現Observer物件

public class StudentObserver : IObserver{
  private Student s;
  public  int ObGrade
 
  public Student student{
  get{return s;}
  set{s=value;}
  }
 
  public void Update(){
  if((s.Grade-this.ObGrade)>=10){
  s.Money+=s.Money*0.05;
  s.LoveLevel+=3;
  this.ObGrade=s.Grade;
  Console.WriteLine("{0}由於成績變差金錢數為:{1}
  愛心指數為:{2}",s.sName,s.Money,s.LoveLevel); 
  }
  else if((this.ObGrade-s.Grade)>=10){
  s.Money+=s.Money*0.05;
  s.LoveLevel+=3;
  this.ObGrade=s.Grade;
  Console.WriteLine("{0}由於成績變好金錢數為:{1} 
  愛心指數為:{2}",s.sName,s.Money,s.LoveLevel);
  }
  else{
  this.ObGrade=s.Grade;
  Console.WriteLine("無變化")
  return;
  } 
  }
}


//下面看看
public class Client{ 
  public static int Main(string[] args){
  myStudent s=new myStudent("yarshray",60,90,100);
  IObserver Io=new StudentObserver();
  s.AddObser(Io);
  s.Notify(); 
 
  s.Grade-=10;
  s.Notify();
 
  s.Grade+=11;
  s.Notify(); 
  return 0;
  }
}

學生成績一旦發生變化,就立刻通知觀察者.同時觀察者作出相應.這裡如果使用ArrayList

是可以觀察一組學生物件的.為了方面沒有那麼做.具體情況具體應用


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-998920/,如需轉載,請註明出處,否則將追究法律責任。

相關文章