当对象间存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知依赖它的对象并全部更新执行。观察者模式属于行为型模式。
生活实例:拍卖的时候,拍卖师观察最高标价,然后通知给其他所有竞价者竞价。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
下面 通过 代码 演示 观察者模式
using Microsoft.VisualBasic;
using System;
using System.Data;
namespace 观察者模式
{
internal class Program
{
static void Main(string[] args)
{
Standard standard = new Standard();
Binary binary = new Binary(standard);
Octal octal = new Octal(standard);
Hexadecimal hexadecimal = new Hexadecimal(standard);
standard.SetState(60);
Console.WriteLine("----------------------");
standard.SetState(100);
/*
* 控制台输出:
二进制为:111100
八进制为:74
十六进制为:3c
----------------------
二进制为:1100100
八进制为:144
十六进制为:64
*/
}
}
//观察者 调度类
public class Standard
{
private int State;
private List<Observer> observers = new List<Observer>();
public void AddObserver(Observer observer)
{
observers.Add(observer);
}
public int GetState()
{
return State;
}
public void SetState(int s)
{
State = s;
this.Update(s);
}
private void Update(int s)
{
foreach (Observer observer in observers)
{
observer.Update();
}
}
}
//观察者 抽象类
public abstract class Observer
{
protected Standard standard;
public abstract void Update();
}
public class Binary : Observer
{
public Binary(Standard standard)
{
base.standard = standard;
base.standard.AddObserver(this);
}
public override void Update()
{
Console.WriteLine("二进制为:"+Convert.ToString(standard.GetState(), 2));
}
}
public class Octal : Observer
{
public Octal(Standard standard)
{
base.standard = standard;
base.standard.AddObserver(this);
}
public override void Update()
{
Console.WriteLine("八进制为:" + Convert.ToString(standard.GetState(), 8));
}
}
public class Hexadecimal : Observer
{
public Hexadecimal(Standard standard)
{
base.standard = standard;
base.standard.AddObserver(this);
}
public override void Update()
{
Console.WriteLine("十六进制为:" + Convert.ToString(standard.GetState(), 16));
}
}
}
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。