观察者模式
- 当一个对象被修改时,则会自动通知依赖它的对象。
- 观察者模式属于行为型模式。
使用场景
- tomcat LifecycleListener
- onclick
demo
package com.example.demo.designpattern;
import java.util.ArrayList;
import java.util.List;
public class Observer {
public static void main(String[] args) {
Button work = new Button();
work.addObserver(new ObsA());
work.addObserver(new ObsB());
work.click();
}
}
interface Observable {
void addObserver(AbstractObserver observer);
void remove(AbstractObserver observer);
void notifyAllObservers(ClickEvent event);
}
class Button implements Observable{
private List<AbstractObserver> observers = new ArrayList<>();
@Override
public void addObserver(AbstractObserver observerInstance){
observers.add(observerInstance);
}
@Override
public void remove(AbstractObserver observer) {
observers.remove(observer);
}
public void notifyAllObservers(ClickEvent event){
for (AbstractObserver observer : observers) {
observer.action(event);
}
}
public void click(){
System.out.println("click");
ClickEvent<Button> buttonClickEvent = new ClickEvent<>(System.currentTimeMillis(), this);
notifyAllObservers(buttonClickEvent);
System.out.println("go on work...");
}
@Override
public String toString() {
return "#a button#";
}
}
interface AbstractObserver{
void action(ClickEvent clickEvent);
}
class ObsA implements AbstractObserver{
@Override
public void action(ClickEvent clickEvent) {
System.out.println(this.getClass().getName() +"->" + new Exception().getStackTrace()[0].getMethodName());
}
}
class ObsB implements AbstractObserver{
@Override
public void action(ClickEvent clickEvent) {
System.out.println(this.getClass().getName() +"->"
+ new Exception().getStackTrace()[0].getMethodName() +"::"
+ clickEvent.time +",eventSource=" + clickEvent.getSource()
+",eventType=" + clickEvent.type);
}
}
abstract class Event<T>{
abstract T getSource();
}
class ClickEvent<T> extends Event<T>{
String type = "click";
long time;
private T source;
@Override
T getSource() {
return this.source;
}
public ClickEvent(long time, T source) {
this.time = time;
this.source = source;
}
}