观察者模式
定义
多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
优点
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。符合依赖倒置原则。
- 目标与观察者之间建立了一套触发机制。
缺点
- 目标与观察者之间的依赖关系并没有完全解除。
- 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
实现
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
ObServer firstObServer = new FirstConcreteObServer();
ObServer secondObServer = new SecondConcreteObServer();
subject.obServerList.add(firstObServer);
subject.obServerList.add(secondObServer);
subject.notifyObServer();
}
}
/**
* 抽象主题
*/
abstract class Subject {
protected List<ObServer> obServerList = new ArrayList<ObServer>();
//增加观察者
public void addObServer(ObServer obServer) {
obServerList.add(obServer);
}
//删除观察者
public void removeObServer(ObServer obServer) {
obServerList.remove(obServer);
}
/**
* 通知观察者
*/
public abstract void notifyObServer();
}
/**
* 具体的主题
*/
class ConcreteSubject extends Subject {
/**
* 通知观察者
*/
@Override
public void notifyObServer() {
System.out.println("具体目标发生变化。。。");
System.out.println("————");
for (ObServer obs : obServerList
) {
obs.response();
}
}
}
/**
* 抽象观察者
*/
interface ObServer {
/**
* 响应
*/
void response();
}
/**
* 第一个具体观察者
*/
class FirstConcreteObServer implements ObServer {
/**
* 响应
*/
@Override
public void response() {
System.out.println("第一个观察者发出反映");
}
}
/**
* 第二个具体观察者
*/
class SecondConcreteObServer implements ObServer {
/**
* 响应
*/
@Override
public void response() {
System.out.println("第二个观察者发出反映");
}
}