观察者模式

观察者模式

参考:

java.awt.event.KeyListener 

KeyListener 会根据我们键盘按下抬起触发事件 方法上有封装好的Event类封装了按键时的信息

图解:

Code:

import java.util.ArrayList;
import java.util.List;

//测试
public class Main {
    public static void main(String[] args) { new Child().wakeUp();}
}

//抽象获取源对象的类
abstract class Event<T>{
    abstract T getSource();
}

//小孩醒的事件类
class WakeupEvent extends Event<Child>{
    long timestamp;
    String location;
    Child source;

    public WakeupEvent(long timestamp, String location,Child source) {
        this.timestamp = timestamp;
        this.location = location;
        this.source = source;
    }

    @Override
    Child getSource() {
        return source;
    }
}

//观察者接口
interface Observer{
    void actionOnWakeup(WakeupEvent wakeupEvent);
}

//事件源对象 小孩
class Child{
    boolean cry = false;
    List<Observer> observerList = new ArrayList<>();
    {
        observerList.add(new Dad());
        observerList.add(new Dog());
    }


    public void wakeUp(){
        System.out.println("child wakeup! wuwuwuwuuwuw...");
        cry = true;
        for (Observer observer : observerList) {
            observer.actionOnWakeup(new WakeupEvent(System.currentTimeMillis(),"bad",this));
        }
    }
}

//观察者 Dad
class Dad implements Observer {
    public void feed(){
        System.out.println("Dad feed !!");
    }


    @Override
    public void actionOnWakeup(WakeupEvent wakeupEven) {
        //可以拿到是谁发出的事件
        Child source = wakeupEven.getSource();
        System.out.println("child status: " + source.cry);

        feed();
    }
}

//观察者Dog
class Dog implements Observer {
    public void call(){
        System.out.println("Dog wawawaw !!");
    }

    @Override
    public void actionOnWakeup(WakeupEvent wakeupEven) {
        call();
    }
}
posted @ 2021-02-04 23:31  immortal_mode  阅读(81)  评论(1)    收藏  举报