观察者模式
观察者模式
对象间存在一对多关系时,使用观察者模式.
当一个对象被修改时,会自动通知依赖它的对象,观察者模式属于行为模式
如何解决
抽象类里有一个ArrayList存放观察者们
观察者和被观察者是抽象耦合的,
代码样例
1.抽象Listener接口
interface Listener<T> {
void onMessage(T t);
}
EmailListener实现类
class EmailListener<String> implements Listener<String> {
@Override
public void onMessage(String msg) {
System.out.println("EmailListener onMessage" + msg);
}
}
TimlineListener实现类
class TimLineListener<String> implements Listener<String> {
@Override
public void onMessage(String msg) {
System.out.println("TimlineListener onMessage" + msg);
}
}
2.抽象subject接口,主题
interface Subject<T> {
void add(Listener listener); // 添加listener
void del(Listener listener); // 删除listener
void notifyListeners(T t); // 通知监听者
void operation(String message);
}
抽象父类abstractSubject
abstract static class AbstractSubject<T> implements Subject<T> {
private CopyOnWriteArrayList<Listener> listeners = new CopyOnWriteArrayList<>();
@Override
public void add(Listener listener) {
listeners.add(listener);
}
@Override
public void del(Listener listener) {
listeners.remove(listener);
}
@Override
public void notifyListeners(T t) {
Iterator<Listener> iterator = listeners.stream().iterator();
while (iterator.hasNext()){
iterator.next().onMessage(t);
}
}
}
主题实现类MySubject
class MySubject extends AbstractSubject {
@Override
public void operation(String message) {
System.out.println(message + "already update");
String result = message + "already update";
notifyListeners(result);
}
}
2.使用
public static void main(String[] args) {
Subject subject = new MySubject();
subject.add(new EmailListener());
subject.add(new TimLineListener());
subject.operation("3");
}
原创:做时间的朋友