在被观察者类中保存有一份观察者名单,在某些业务逻辑执行的时候,会调用观察者的通知接口
- 观察者接口
IObserver
package pattern.observer;
/**
* 观察者接口
*/
public interface IObserver {
void handleSome(String message);
}
2.观察者实现类ObserverFirst,ObserverSecond
package pattern.observer;
/**
* 第一个观察者
*/
public class ObserverFirst implements IObserver {
@Override
public void handleSome(String message) {
System.out.println(this.getClass().getSimpleName() + "正在处理【" + message + "】");
}
}
package pattern.observer;
/**
* 第二个观察者
*/
public class ObserverSecond implements IObserver {
@Override
public void handleSome(String message) {
System.out.println(this.getClass().getSimpleName() + "正在处理【" + message + "】");
}
}
- 被观察者接口
IObserverable
package pattern.observer;
import java.util.ArrayList;
/**
* 被观察者接口
*/
public interface IObserverable {
/**
* 添加观察者
*/
void addObserver(IObserver iObserver);
/**
* 删除观察者
*/
void removeObserver(IObserver iObserver);
/**
* doSome,被观察者观察的方法
*/
void doSome(String some);
/**
* 观察者列表
*/
ArrayList<IObserver> observerList();
}
- 被观察者实现类
Observerable
package pattern.observer;
import java.util.ArrayList;
public class Observerable implements IObserverable {
ArrayList<IObserver> observers;
public Observerable() {
observers = new ArrayList<>();
}
/**
* 添加观察者
*/
public void addObserver(IObserver iObserver) {
observers.add(iObserver);
}
/**
* 删除观察者
*/
public void removeObserver(IObserver iObserver) {
observers.remove(iObserver);
}
/**
* doSome,被观察者观察的方法
*/
public void doSome(String message) {
for (IObserver observer : observers) {
observer.handleSome(message);
}
}
/**
* 观察者列表
*/
public ArrayList<IObserver> observerList() {
return observers;
}
}
- 测试
package pattern.observer;
import org.apache.commons.lang.StringUtils;
class MainClass {
public static void main(String[] args) {
/**
* 观察者一号
*/
IObserver first = new ObserverFirst();
/**
* 观察者二号
*/
IObserver second = new ObserverSecond();
/**
* 被观察者
*/
IObserverable observerable = new Observerable();
/**
* 被观察者添加观察者
*/
observerable.addObserver(first);
observerable.addObserver(second);
/**
* 被观察者执行业务逻辑
*/
observerable.doSome("左转");
System.out.println(StringUtils.repeat("=", 30));
/**
* 从观察者列表中删除第一个观察者
*/
observerable.removeObserver(first);
observerable.doSome("直行");
}
}
结果;
ObserverFirst正在处理【左转】
ObserverSecond正在处理【左转】
==============================
ObserverSecond正在处理【直行】