观察者模式定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。
项目中一个对象状态发生变化,若需要通知到所有依赖其的对象,则我们可以使用观察者模式。
以下代码演示观察者模式简单的实际运用:
定义一个Subject(主题)接口:
package com.ldl.cn.ObserverModel;
public interface Subject {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifySubject();
}
定义一个RealSubject类实现Subject接口:
package com.ldl.cn.ObserverModel;
import java.util.ArrayList;
import java.util.List;
public class RealSubject implements Subject{
private List<Observer> observers = new ArrayList<>();
private String updateSubject;
@Override
public void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if (observers.contains(observer)) {
observers.remove(observer);
}
}
@Override
public void notifySubject() {
for (Observer observer : observers) {
observer.update(updateSubject);
}
}
public void submitSubject(String updateSubject) {
this.updateSubject = updateSubject;
notifySubject();
}
}
定义一个Observer (观察者)接口:
package com.ldl.cn.ObserverModel;
public interface Observer {
public void update(String msg);
}
定义一个RealObserver类实现Observer接口:
package com.ldl.cn.ObserverModel;
public class RealObserver implements Observer{
private String name;
public RealObserver(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
@Override
public void update(String msg) {
System.out.println(name+"收到subject:"+msg);
}
}
编写测试类:
package com.ldl.cn.ObserverModel;
public class TestObserverPattern {
public static void main(String[] args) {
Subject subject = new RealSubject();
RealObserver realObserver1 = new RealObserver("张三");
RealObserver realObserver2 = new RealObserver("李四");
RealObserver realObserver3 = new RealObserver("王五");
subject.addObserver(realObserver1);
subject.addObserver(realObserver2);
subject.addObserver(realObserver3);
((RealSubject) subject).submitSubject("2019年五一劳动节放假4天!");
System.out.println("--------------------");
subject.removeObserver(realObserver1);
((RealSubject) subject).submitSubject("2019年十一国庆节放假7天!");
}
}
运行结果:
张三收到subject:2019年五一劳动节放假4天!
李四收到subject:2019年五一劳动节放假4天!
王五收到subject:2019年五一劳动节放假4天!
--------------------
李四收到subject:2019年十一国庆节放假7天!
王五收到subject:2019年十一国庆节放假7天!