package 观察者模式;
import java.util.*;//包含List接口和集合类ArrayList
//定义了一种一对多的依赖关系,让多个观察对象(公司员工)同时监听一个主题对象(秘书),
//主题对象状态发生变化时,会通知所有的观察者,使它们能够更新自己。
abstract class Subject{//抽象通知者
protected List <Observer> observers=new ArrayList<Observer>();//观察者列表
protected String subjectState;//通知者的状态
public void Add(Observer observer){//增加被通知的观察者
observers.add(observer);
}
public void Remove(Observer observer){//移除被通知的观察者
observers.remove(observer);
}
public void setState(String subjectState){
this.subjectState=subjectState;
}
public String getState(){
return subjectState;
}
public abstract void Notify();//通知
}
class ConcreteSubjectA extends Subject{//具体通知者
public void Notify(){
System.out.println("前台通知:");
for(Observer observer:observers){//新循环,遍历集合列表中的所有元素
observer.Update();
}
}
}
class ConcreteSubjectB extends Subject{//具体通知者
public void Notify(){
System.out.println("秘书通知:");
for(Observer observer:observers){//新循环,遍历集合列表中的所有元素
observer.Update();
}
}
}
abstract class Observer{//抽象观察者
protected String name;//观察者姓名
protected Subject sub;//抽象通知者对象变量
protected String observerState;//观察者的状态
public Observer(String name,Subject sub){
this.name=name;this.sub=sub;
}
public abstract void Update();//抽象更新方法
}
class ConcreteObserverA extends Observer{//具体观察者
public ConcreteObserverA(String name,Subject sub){
super(name,sub);
}
public void Update(){//通知者状态发生变化时,收到通知后,自动更新自己
observerState=sub.getState();
System.out.println(name+"!"+observerState+",不要看NBA了,要开始工作了");
}
}
class ConcreteObserverB extends Observer{//具体观察者
public ConcreteObserverB(String name,Subject sub){
super(name,sub);
}
public void Update(){//通知者状态发生变化时,收到通知后,自动更新自己
observerState=sub.getState();
System.out.println(name+"!"+observerState+",不要玩股票了,要开始工作了");
}
}
public class Test {
public static void main(String[] args){
Subject sub=new ConcreteSubjectA();//创建一个通知者
Observer observer1=new ConcreteObserverA("小王",sub);//观察者小王
Observer observer2=new ConcreteObserverB("老李",sub);//观察者老李
//加入观察者列表
sub.Add(observer1);
sub.Add(observer2);
sub.Remove(observer2);
//通知者的状态发生变化
sub.setState("老板回来了");
//通知观察者
sub.Notify();
}
}