自己的话说:就是把一个或者多个动作,固定地安排到一个动作的后面
Observer 观察者
Listener 监听者
Hook(钩子) 钩子函数
Callback 回调函数
这四个的根本都是观察者模式。
生活实践概述:一一是我闺女
这就是实际要解决的问题:
代码:
package Observer;
import com.sun.javafx.scene.control.skin.VirtualFlow;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Yiyi yiyi = new Yiyi();
yiyi.action();
}
}
//事件发起者类 这件事上是孩子,还可以是 按钮
class Yiyi {
//事件观察者列表
private List<Observer> observers = new ArrayList<>();
{
observers.add(new Me());
observers.add(new Mother());
}
//事件发生点 在发生之后 调用 观察者的动作 可以优化成 反射 配置一个配置文件就好
public void action() {
Event<Yiyi> cryEnvent = new CryEvent(System.currentTimeMillis(), "bed", this);
Event<Yiyi> smallEnvent = new SmallEvent(System.currentTimeMillis(), "bed", this);
((CryEvent)cryEnvent).action();
for (Observer o : observers) {
o.actionOnCry(cryEnvent);
}
((SmallEvent)smallEnvent).action();
for (Observer o : observers) {
o.actionOnSmall(smallEnvent);
}
}
}
//事件接口
interface Event<T> {
T getSource();
}
//孩子事件
class ChildEvent<T> implements Event<T> {
long timestamp;
String loc;
T source;
public ChildEvent(long timestamp, String loc, T source) {
this.timestamp = timestamp;
this.loc = loc;
this.source = source;
}
public T getSource() {
return source;
}
}
//具体事件 哭
class CryEvent extends ChildEvent<Yiyi> {
public CryEvent(long timestamp, String loc, Yiyi source) {
super(timestamp, loc, source);
}
public void action() {
System.out.println("宝宝哭了");
}
}
//具体事件 笑
class SmallEvent extends ChildEvent<Yiyi> {
public SmallEvent(long timestamp, String loc, Yiyi source) {
super(timestamp, loc, source);
}
public void action() {
System.out.println("宝宝笑了");
}
}
//观察者接口
interface Observer {
void actionOnCry(Event event);
void actionOnSmall(Event event);
}
//我也是就是爸爸
class Me implements Observer {
//统一的哭事件需要做的事情
public void actionOnCry(Event event) {
who();
hug();
}
//统一的笑事件需要做的事情
public void actionOnSmall(Event event) {
who();
kiss();
}
public void who() {
System.out.print("爸爸");
}
public void hug() {
System.out.println("抱抱");
}
public void kiss() {
System.out.println("亲亲");
}
}
//妈妈
class Mother implements Observer {
@Override
public void actionOnCry(Event event) {
who();
nurse();
}
public void actionOnSmall(Event event) {
who();
photograph();
}
public void who() {
System.out.print("妈妈");
}
public void nurse() {
System.out.println("喂奶奶");
}
public void photograph() {
System.out.println("拍照");
}
}
/**
* 返回值
* 宝宝哭了
* 爸爸抱抱
* 妈妈喂奶奶
* 宝宝笑了
* 爸爸亲亲
* 妈妈拍照
*/