观察者模式又叫发布-订阅模式(Publish/Subscribe)
定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
结构图
使用观察者模式的动机
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。
什么时候考虑使用观察者模式
当一个对象的改变需要同时改变其他对象的时候。而且它不知道有多少对象有待改变时,应该考虑使用观察者模式。
一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式就可以将这两者封装在独立的对象中使它们各自独立的改变和复用。
观察者模式所做的工作其实即使在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
通过事件委托实现
事件委托说明
委托就是一种引用方法的类型。一旦为委托分配了方法,委托将于该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。
一旦为委托分配了方法,委托将与该方法具有完全相同的行为。而且,一个委托可以搭载多个方法,所有方法被依次唤起。可以使得委托对象所搭载的方法并不需要属于同一个类。
委托前提,委托对象所搭载的所有方法必须具有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。
模式实现-例:
//声明一个委托,名称叫EventHandler(事件处理程序),无参数,无返回值。
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; }
}
}
//客户端
static void Main(string[] args)
{
//老板
Boss huhansan = new Boss();
//看股票的同事
StockObservertongshi1 = new StockObserver("魏",huhansan);
//看NBA的同事
NBAObservertongshi2 = new NBAObserver("易",huhansan);
//将看'股票者'的'关闭股票程序方法'和'看NBA者'的'关闭NBA直播方法'挂钩到'老板'的更新上,也就是讲两个不同 类的不同方法委托给'老板'类的'更新'了.
huhansan.Update += newEventHandler(tongshi1.CloseStockMarket );
huhansan.Update += newEventHandler(tongshi2.CloseNBADirectSeeding );
//老板回来
huhansan.SubjectState = "我胡汉三回来了!";
//发出通知
huhansan.Notify();
Console.Read();
}