意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
适用性:
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
namespace Observer_DesignPattern
{
using System;
using System.Collections;
class Subject
{
private ArrayList list = new ArrayList();
private string strImportantSubjectData = “Initial”;
public string ImportantSubjectData
{
get
{
return strImportantSubjectData;
}
set
{
strImportantSubjectData = value;
}
}
public void Attach(Observer o)
{
list.Add(o);
o.ObservedSubject = this;
}
public void Detach(Observer o)
{
}
public void Notify()
{
foreach (Observer o in list)
{
o.Update();
}
}
}
class ConcreteSubject : Subject
{
public void GetState()
{
}
public void SetState()
{
}
}
abstract class Observer
{
protected Subject s;
public Subject ObservedSubject
{
get
{
return s;
}
set
{
s = value;
}
}
abstract public void Update();
}
class ConcreteObserver : Observer
{
private string observerName;
public ConcreteObserver(string name)
{
observerName = name;
}
override public void Update()
{
Console.WriteLine(“In Observer {0}: data from subject = {1}”,
observerName, s.ImportantSubjectData);
}
}
/// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static int Main(string[] args)
{
// Set up everything
ConcreteSubject s = new ConcreteSubject();
ConcreteObserver o1 = new ConcreteObserver(“first observer”);
ConcreteObserver o2 = new ConcreteObserver(“second observer”);
s.Attach(o1);
s.Attach(o2);
// make changes to subject
s. ImportantSubjectData = “This is important subject data”;
// Notify all observers
s.Notify();
return 0;
}
}
最新评论