被觀察者:當被觀察者狀態(tài)發(fā)生改變時日川,要通知其他的觀察者萄传,在被觀察者的方法中不摻雜任何觀察者的代碼儒陨,在被觀察者的方法中定義一個委托酥馍,將觀察者的方法添加到這個委托里辩昆,在被觀察者中調(diào)用這個委托方法就可以了。
例:貓和老鼠
Class Cat{
string Name;
string Color;
public Cat(string name,string color)
{
this.Name=name;
this.Color=color;
}
public void CatComming()
{
Console.WriteLine(Color+"的貓咪"+Name+"來了")旨袒;
//判斷委托方法是否為空,否者會拋異常
if(CatCome!=null)
{
CatCome();
}
}
public Action CatCome; //定義一個委托术辐,將觀察者的方法添加到這個委托里
}
Class Mouse{
string Name;
string Color;
public Mouse(string name,string color)
{
this.Name=name;
this.Color=color;
}
public void RunAway()
{
Console.WriteLine(Color+"的小老鼠"+Name+“跑呀跑”)
}
}
Mina{
Cat cat=new Cat("大臉貓","五顏六色")砚尽;
Mouse mouse1=new Mouse("米老鼠","黑白色");
cat.CatCome+=mouse1.RunAway(); //實例化被觀察者對象cat,調(diào)用委托CatCome添加觀察者的方法RunAway();
Mouse mouse2=new Mouse("藍皮鼠","藍色")辉词;
cat.CatCome+=mouse2.RunAway();
cat.CatComming();
}
優(yōu)化后:
Class Mouse{
string Name;
string Color;
public Mouse(string name,string color,Cat cat) //將被觀察者作為參數(shù)傳入觀察者的方法中
{
this.Name=name;
this.Color=color;
cat.CatCome+=this.RunAway; //當被觀察者狀態(tài)發(fā)生改變時必孤,就添加觀察者的方法
}
public void RunAway()
{
Console.WriteLine(Color+"的小老鼠"+Name+“跑呀跑”)
}
}
Mina{
Cat cat=new Cat("大臉貓","五顏六色");
Mouse mouse1=new Mouse("米老鼠","黑白色",cat);
Mouse mouse2=new Mouse("藍皮鼠","藍色",cat)瑞躺;
cat.CatComming();
}
觀察者設計模式敷搪,我的理解就是一個多播委托,一個委托指向多個方法幢哨。一個被觀察者指向多個觀察者