/*
* Subject类,可翻译为主题或抽象投资者,一般用一个抽象或者一个接口实现,它把所有对观察者对象的引用
* 保存在一个聚合里,每个主题都可以有任何数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
*/
public class Subject {
private List <observer> observers = new List();
//增加观察者
public void Attach(Oberver observer){
observers.add(observer);
}
//移除观察者
public void Detach(Oberver observer){
observers.remove(observer);
}
//通知
public void Notify(){
foreach(Observer o in observer){
o.update();
}
}
}
/*Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口,抽象观察者一般用一个抽象类或者一个接口实现,
*更新接口通常包含一个Update方法,这个方法叫做更新方法。
*/
abstract class Observer{
public abstract void Update();
}
/*ConcreteSubject类,叫做具体主题或具体通知,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有的登记过的观察者发出通知,具体主题角色通常*用一个具体子类实现
*/
class ConcreteSubject enxtends Subject{
private String subjectState;
//具体被观察者状态
public String SubjectState{
set{ subjectState = value;}
get{ return subjectState;}
}
}
/*ConcreteObserver类,具体观察者,实现抽象对象者角色所有要求更新接口,以便使本身的状态与主题的状态相协调,具体观察者可以保证一个指向具体主题对象的引
*用,具体观察者角色通常用一个具体子类实现。
*/
class ConcreteOBserver extends 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,observer);
}
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 ConcrteObserver(s,"X"));
s.Attach(new ConcrteObserver(s."y"));
s.Attach(new ConcrteObserver(s,"Z"));
s.SubjectState="ABC";
s.Notify();
}