观察者模式就是将一个系统分割成一系列相互协作的类,有一个很不好的副作用,那就是需要维护相关对象间的一致性,但是通过使用委托可以解决这一问题。
实际上,观察者模式所做的工作其实就是在接触耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
下面来看一个例子:员工(观察者)在公司观察其他事情时不能让老板看到,所以要通过前台秘书(通知者),当秘书看到老板回来时,立即打电话通知员工,告诉他们老板回来了,各就各位继续工作。
interface Subject
{
void Notify();
string SubjectState
{
get ;
set ;
}
}
这是通知者接口,它不依赖于观察者,下面是观察者类
// 看股票的同事
class StockObserver
{
private string name;
private Subject sub;
public StockObserver( string name, Subject sub)
{
this .name = name;
this .sub = sub;
}
// 关闭股票行情
public void CloseStockMarket()
{
Console.WriteLine( " {0} {1} 关闭股票行情,继续工作! " ,sub.SubjectState,name);
}
}
// 看NBA的同事
class NBAObserver
{
private string name;
private Subject sub;
public NBAObserver( string name, Subject sub)
{
this .name = name;
this .sub = sub;
}
// 关闭NBA直播
public void CloseNBADirectSeeding()
{
Console.WriteLine( " {0} {1} 关闭NBA直播,继续工作! " , sub.SubjectState, name);
}
}
下面是通知者类实现(当秘书无法通知时被老板发现了,这时老板也就是通知者了):
// 声明一个委托
delegate void EventHandler();
// 老板类
class Boss:Subject
{
// 声明一事件Update,类型为委托EventHandler
public event EventHandler Update;
private string action;
public void Notify()
{
// 在访问“通知”方法时,调用“更新”
Update();
}
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
// 秘书类
class Secretary : Subject
{
// 声明一事件Update,类型为委托EventHandler
public event EventHandler Update;
private string action;
public void Notify()
{
// 在访问“通知”方法时,调用“更新”
Update();
}
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
客户端代码:
static void Main( string [] args)
{
Boss syd = new Boss();
StockObserver tongshi1 = new StockObserver( " 张三 " , syd);
NBAObserver tongshi2 = new NBAObserver( " 李四 " , syd);
syd.Update += new EventHandler(tongshi1.CloseStockMarket);
syd.Update += new EventHandler(tongshi2.CloseNBADirectSeeding);
syd.SubjectState = " 我回来了! " ;
// 发出通知
syd.Notify();
Console.ReadLine();
}
委托是一种引用方法类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托的使用可以像其他任何方法一样,具有参数和返回值。委托也可以看作是对函数的抽象,是函数的 ‘类’ ,委托的实例将代表一个具体的函数。
下面是一个委托的示例:
syd.Update += new EventHandler(tongshi1.CloseStockMarket);
委托也是有前提的,那就是委托对象所搭载的所有方法必须有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。
我就是一个小菜,有很多不足的地方请多指点。