观察者模式:
当某个事件发生时,通知客户端进行响应,如监听器的原理,即可采用此模式来实现。
观察者对主题中某些属性的改变感兴趣,或者对某个事件的发生感兴趣。
这些变化将由主题通知观察者。
观察者需要先注册到主题中,只要注册到主题中,当事件发生时就会得到通知。
当不关心事件是否发生时,可以取消注册。
===》主题
package pattern.observer;
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
package pattern.observer;
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject {
private String currentStatus;
private boolean illegal;
//维护若干感兴趣的观察者
private List<Observer> observers;
public ConcreteSubject() {
observers = new ArrayList<Observer>();
}
//事件发生
public void setDatas(String status, boolean illegal) {
this.currentStatus = status;
this.illegal = illegal;
notifyObserver();//事件发生时,通知客户端
}
//注册
public void registerObserver(Observer observer) {
if(observer==null)
return;
if(!observers.contains(observer))
this.observers.add(observer);
}
//取消注册
public void removeObserver(Observer observer) {
if(observer==null)
return;
if(observers.contains(observer))
this.observers.remove(observer);
}
//将事件通知到客户端
public void notifyObserver() {
for(Observer obs : observers)
obs.update(this);
}
//客户端可以采用拉的方式提取需要的数据
public String getCurrentStatus() {
return currentStatus;
}
public boolean isIllegal() {
return illegal;
}
}
===》观察者
package pattern.observer;
public interface Observer {
void update(Subject subject);
}
package pattern.observer;
public class ClientA implements Observer {
private String status;
public ClientA(Subject subject) {
subject.registerObserver(this);
}
public void update(Subject subject) {
if(subject instanceof ConcreteSubject) {
ConcreteSubject concreteSubject = (ConcreteSubject) subject;
handleData(concreteSubject);
showData();
}
}
private void handleData(ConcreteSubject subject) {
this.status = subject.getCurrentStatus();
}
private void showData() {
System.out.println("status :" + this.status);
}
}
package pattern.observer;
public class ClientB implements Observer {
private boolean illegal;
public ClientB(Subject subject) {
subject.registerObserver(this);
}
public void update(Subject subject) {
if(subject instanceof ConcreteSubject) {
ConcreteSubject concreteSubject = (ConcreteSubject) subject;
handleData(concreteSubject);
showData();
}
}
private void handleData(ConcreteSubject subject) {
this.illegal = subject.isIllegal();
}
private void showData() {
System.out.println("status :" + this.illegal);
}
}
===》测试
package pattern.observer;
public class ObserverTest {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
//注册
Observer a = new ClientA(subject);
Observer b = new ClientB(subject);
//状态发生改变,观察者将得到通知
subject.setDatas("good", false);
//解除注册
subject.removeObserver(b);
subject.setDatas("bad", true);
}
}