大话设计模式之观察者模式

又叫做发布订阅模式

abstract class Subject {
  private IList<Observer> observers = new List<Observer>();
  public void Attach(Observer observer) {
    observers.Add(observer);
  }
  public void Detach(Observer observer) {
    observers.Remove(observer);
  }
  public void Notify() {
    foreach(Observer o in observers) {
      o.Update();
   }
  }
}
abstract class Observer {
  public abstract void Update();
}

// 具体主题
class ConcreteSubject : Subject {
  private string subjectState;
  public string SubjectState {
    get { return subjectState;}
    set { subjectState = value;} 
  }
}

// 具体观察者
class ConcreteObserver : Observer {
  private string name;
  private string observerState;
  private ConcreteSubject subject;

  public ConcreteObserver(ConcreteSubject subject,string name) {
    this.subject = subject;
    this.name = name;
  }
  public override void Update() {
    observerState  = subject.SubjectState;
    Console.WriteLine("观察者{0}的新状态是{1}",name,observerState);
  }
  public ConcreteSubject Subject {
    get {return subject;}
    set {subject = value; }
  }
}
static void Main(String[] args) {
  ConcreteSubject s = new ConcreteSubject();
  s.Attach(new ConcreteObserver(s,"X");
  s.Attach(new ConcreteObserver(s,"Y");
  s.Attach(new ConcreteObserver(s,"Z");
  s.SubjectState = "ABC";
  s.Notify();
  

}


一个subject可以有任意数目的依赖它的观察者,一旦subject的状态发生改变,所有observer都可以得到通知

什么时候考虑使用观察者模式:

当一个对象的改变,需要同时改变其他的对象,且它不知道具体有多少对象有待改变时,应考虑使用观察者模式。

观察者模式所做的工作其实就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。


事件委托

委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的类,委托的实例将代表一个具体的函数
    
// 声明了一个特殊的类
delegate void EventHandler();
// 理解为声明一个类的变量
public event EventHandler Update;

一个委托可以搭载多个方法,所有方法被依次唤起,更重要的是,它可以使委托对象所搭载的方法并不需要属于同一个类。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值