Code in C#:
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;
}
}
}
Code in SOME:
CSubject
AObserver[] _list
string ImportantSubjectData
Attach(AObserver)
Detach(AObserver)
Notify()
CConcreteSubject : CSubject
GetState()
SetState()
AObserver
CSubject S
a_Update()
CConcreteObserver : AObserver
(string _observerName)
o_Update()
CClient
main
CClient.main
{
CConcreteSubject s.();
CConcreteObserver o1.("first observer"); //constant identifier can only be string or number
CConcreteObserver o2.("second observer");
s.Attach(o1)
{
_list.Add(o1);
o1.ObservedSubject = s; //"o1.ObservedSubject = this"
};
s.Attach(o2);
<% s.ImportantSubjectData = "This is important subject data"; %>
s.Notify()
{
<% //if you don't wanna unfold any invoking, just snip all
foreach (Observer o in list)
{
o.Update();
}
%>
};
}