一、观察者模式概述
+观察者模式又叫做发布-订阅模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象,使它们能够自动更新自己。
- 将一个系统分割成一系列相互协作的类有一个很不好的副作用,就是需要维护相关对象间的一致性。但是不能为了维持一致性二是的各类之间紧密偶尔,这几样会给维护,扩展和重用都带来不便。
- 观察者模式的关键对象是:
- 主题 Subject
- 观察者 Observer
- 一个主题可以有很多个 Observer,具体谁是观察者,主题不用知道。
二、什么时候使用观察者模式
- 当一个对象改变的时候同时改变其他对象,并且它不需要直到具体有多少对象有待改变的时候。
三、委托
- 委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的是用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的类,委托的实例将代表一个具体的函数。
- 一个委托可以搭载多个方法,所有方法被一次唤起。更加重要的是,它可以使得委托对象所搭载的方法并不需要属于同一个类。
- 代码
//通知者接口
interface Subject
{
void Attatch(Observer observer);
void Detach(Observer observer);
void Notify();
string SubjectState
{
get;
set;
}
}
//声明一个委托
delegate void EventHandler();
class Boss: Subject
{
//声明一个事件 Update,类型为委托 EventHandler
public event EventHandler Update;
//同事列表
// private IList<Observer> observers = new List<observer>();
private string action;
// //add
// public void Attatch(Observer observer)
// {
// observers.Add(observer);
// }
// //minus
// public void Detach(Observer observer)
// {
// observers.Remove(observer);
// }
//notify
public void Notify()
{
Update();
}
//Boss state
public string SubjectState
{
get{return action;}
set{action = value;}
}
}
class Secretary:Subject
{
//同事列表
private IList<Observer> observers = new List<observer>();
private string action;
//add
public void Attatch(Observer observer)
{
observers.Add(observer);
}
//minus
public void Detach(Observer observer)
{
observers.Remove(observer);
}
//notify
public void Notify()
{
foreach (Observer o in observers)
{
o.Update();
}
}
//Boss state
public string SubjectState
{
get{return action;}
set{action = value;}
}
}
//abstract observer
abstract class Observer
{
protected string name;
protected Subject sub;
public Observer(string name,Subject sub)
{
this.name = name;
this.sub = sub;
public abstract void Update();
}
}
class StockObserver
{
public StockObserver(string name.Subject sub):base(name,sub)
{
}
public override void CloseStockMarket()
{
Console.WriteLine("{0} {1} 关闭股票行情,继续工作!",sub.SubjectState,name);
}
}
class NBAObserver
{
private string name;
private Subject sub;
public NBAObserver(string name,Subject sub)
{
this.name = name;
this.sub = sub;
}
//close NBA
public void CloseNBADirectSeeding()
{
Console.WriteLine("{0} {1} 关闭NBA,继续工作!",sub.SubjectState,name);
}
}
//客户端主函数
class MainClass
{
public static void Main(strnig[] args)
{
//老板
Boss boss = new Boss();
//同事1
StockObserver one = new StockObserver("nameOne",boss);
//同事2
StockObserver two = new StockObserver("nameTwo",boss);
boss.Update += EventHandler(one.CloseStockMarket);
boss.Update += EventHandler(two.CloseNBADirectSeeding);
// boss.Attatch(one);
// boss.Attatch(two);
// boss.Detach(one);
boss.SubjectState = "Come Back";
boss.Notify();
}
}
```