一,定义:
观察者模式又叫发布-订阅模式(Publish/Subscribe)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主体对象在状态发生变化时,会通知所有的观察者对象,是他们能够自动更新自己
观察者模式一般会牵扯至少两个角色Subject或Publish,叫做具体主题或通知者,将所有有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知
observer或subscribe类,具体观察者.
二:作用:
观察者模式所做的工作其实就是在解耦合.让耦合的双方都依赖于抽象,而不是依赖具体.从而使得各自的变化都不会影响另一边的变化
三,例子:
1,使用接口
interface Subject
{
void Notify();
string SubjectState { get; set; }
}
delegate void PatrolHander();
class Teacher : Subject
{
public event PatrolHander UpdateEvent;
public string SubjectState
{ get; set; }
public void Notify()
{
if (UpdateEvent != null)
{
UpdateEvent();
}
}
}
class Student
{
private string name;
private Subject sub;
public Student(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
public void Study()
{
Console.WriteLine("{0},{1}开始学习", sub.SubjectState, name);
}
}
class Client
{
static void Main(string[] args)
{
Teacher t = new Teacher();
Student s = new Student("ad", t);
t.SubjectState = "老师来了";
t.UpdateEvent += s.Study;
t.Notify();
Console.ReadKey();
}
}
2,类似1,才有中间加类,隔离.
例子(猫捉老鼠):
class Cat
{
//委托
public delegate void CatShout(object sender,CatShoutEventArgs args);
//基于委托定义事件
public event CatShout CatShoutEvent;
public string name;
public Cat(string name){
this.name = name;
}
public void Shout()
{
Console.WriteLine("喵,我是{0}", this.name);
//说明该事件有人订阅
if (CatShoutEvent != null)
{
CatShoutEventArgs arg = new CatShoutEventArgs();
arg.Name = this.name;
CatShoutEvent(this,arg);
}
}
}
class Mouse
{
private string name;
public Mouse(string name)
{
this.name = name;
}
public void Run(object sender,CatShoutEventArgs arg)
{
Console.WriteLine("{0}来了,{1}快跑",arg.Name, this.name);
}
}
class CatShoutEventArgs:EventArgs
{
private string name;
public string Name
{
set { name = value; }
get { return name; }
}
}
class Program
{
static void CatWithMouse()
{
Cat tom = new Cat("Tom");
Cat jim = new Cat("Jim");
//老鼠
Mouse jerry = new Mouse("Jerry");
Mouse jack = new Mouse("jack");
//订阅事件
tom.CatShoutEvent += jerry.Run;
jim.CatShoutEvent += jack.Run;
//tom来了
tom.Shout();
//jim来了
jim.Shout();
}
static void Main(string[] args)
{
Program.CatWithMouse();
Console.ReadKey();
}
}