观察者模式
<设计模式其实很简单>笔记
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。
//抽象的观察者类
public abstract class Observer{
public abstract void Update();
}
//具体的观察者
public class ConcreteObserver extends Observer{
private String observerName;
private String State;
private ConcreteSubject concreteSubject;
//得到具体的主题
public ConcreteSubject getConcreteSubject(){
Return concreteSubject;
}
//设定具体的主题
public void setConcreteSubject(ConcreteSubject concreteSubject){
this.concreteSubject = concreteSubject;
}
//含参构造方法
public ConcreteObserver(ConcreteSubject concreteSubject , String ovserverName){
this.concreteSubject = concreteSubject;
this.observerName = ovserverName;
}
//覆盖更新状态的方法
//获取情报方法
@Override
public void Update(){
State = concreteSubject.getState();
System.out.println(observerName + "观察到的状态是:" + State);
}
}
//抽象的通知者类
public abstract class Subject{
private ArrayList<Observer> observers = new ArrayList<Observer>();
//进入
public void Attach(Observer observer){
observer.add(observer);
}
//离开
public void Detach(Observer observer){
observer.remove(observer);
}
//通知
public void Notify(){
for(int i = 0; i < observers.size() ; i++){
((Observer)observers.get(i)).Update();
}
}
}
//具体的通知者
public class ConcreteSubject extends Subject{
private String State;
//设定状态
public void setState(String state){
State = state;
}
//获取状态
public String getState(){
return State;
}
}
//客户端
public static void main(String[] args){
ConcreteSubject concreteSubject = new ConcreteSubject();
concreteSubject.Attach(new concreteObserver(concreteSubject,"1号观察者"));
concreteSubject.Attach(new concreteObserver(concreteSubject,"2号观察者"));
concreteSubject.Attach(new concreteObserver(concreteSubject,"3号观察者"));
concreteSubject.setState("Flying");
concreteSubject.Notify();
}
//观察者拥有通知者的对象,是多对一的关系。通知者保留所有有观察者的对象。是一对多的关系。
③适用的地方:
当一个抽象模型有两个方面,而其中一个方面必须依赖于另一个方面时。
当对一个对象的改变需要同时改变其他的对象但是却不知道具体有多少个对象等待改变时
当一个对象必须通知其他对象但是却不能与其他对象紧密耦合时。