观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Observer模式的角色:
Subject(被观察者)
被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
被观察者的具体实现。包含一些基本的属性状态及其他操作。
Observer(观察者)
接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
ConcreteObserver
观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。
package gof23;
import java.util.LinkedList;
import java.util.List;
public class ObserverTest {
public static void main(String[] args) {
Subject boss = new Boss();
StockObserver colleague1 = new StockObserver("张三", boss);
NBAObserver colleague2 = new NBAObserver("李四", boss);
boss.attach(colleague1);
boss.attach(colleague2);
boss.setAction("你们的老板我第一次回来了");
boss.notifyObserver();
System.out.println();
boss.detach(colleague2);
boss.setAction("你们的老板我第二次回来了");
boss.notifyObserver();
}
}
/*
* 通知者接口
*/
interface Subject{
int i =10;
//增加观察者
public void attach(Observer observer);
//移除观察者
public void detach(Observer observer);
//通知
public void notifyObserver();
//返回状态
public String getAction();
//设置状态
public void setAction(String action);
}
/*
* 老板作为通知者
*/
class Boss implements Subject {
private List<Observer> observers = new LinkedList<>();
private String action;
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObserver() {
for(Observer observer : observers) {
observer.update();
}
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
/*
* 秘书作为通知者
*/
class Secretary implements Subject {
private List<Observer> observers = new LinkedList<>();
private String action;
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObserver() {
for(Observer observer : observers) {
observer.update();
}
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
/*
* 观察者抽象类
*/
abstract class Observer {
protected String name;
protected Subject subject;
public Observer(String name, Subject sub){
this.name = name;
this.subject = sub;
}
public abstract void update();
}
/*
* 股票观察者
*/
class StockObserver extends Observer {
public StockObserver(String name, Subject sub) {
super(name, sub);
}
@Override
public void update() {
System.out.println(name + "," + subject.getAction() + " 关闭股票行情,继续工作!");
}
}
/*
* NBA观察者
*/
class NBAObserver extends Observer {
public NBAObserver(String name, Subject sub) {
super(name, sub);
}
@Override
public void update() {
System.out.println(name + "," + subject.getAction() + " 关闭NBA直播,继续工作!");
}
}张三,你们的老板我第一次回来了 关闭股票行情,继续工作! 李四,你们的老板我第一次回来了 关闭NBA直播,继续工作! 张三,你们的老板我第二次回来了 关闭股票行情,继续工作!
原文地址:http://blog.csdn.net/hjiam2/article/details/38147635