观察者模式

作者: 尉昌达 | 来源:发表于2020-06-19 07:19 被阅读0次
    observer
    • 观察者
    interface Observer {
        void actionOnWakeUp(wakeUpEvent event);
    }
    
    class Dad implements Observer {
        public void feed() {
            System.out.println("dad feeding...");
        }
    
        @Override
        public void actionOnWakeUp(wakeUpEvent event) {
            Child source = event.getSource(); //这样可以获取事件源对象。
            feed();
        }
    }
    
    class Mum implements Observer {
        public void hug() {
            System.out.println("mum hugging...");
        }
    
        @Override
        public void actionOnWakeUp(wakeUpEvent event) {
            hug();
        }
    }
    
    class Dog implements Observer {
        public void wang() {
            System.out.println("dog wang...");
        }
    
        @Override
        public void actionOnWakeUp(wakeUpEvent event) {
            wang();
        }
    }
    
    • 被观察者
    class Child {
        private boolean cry = false;
        private List<Observer> observers = new ArrayList<>();
    
        {
            observers.add(new Dad());
            observers.add(new Mum());
            observers.add(new Dog());
            observers.add((e)->{
                System.out.println("ppp");
            });
            //hook callback function
        }
    
    
        public boolean isCry() {
            return cry;
        }
    
        public void wakeUp() {
            cry = true;
    
            wakeUpEvent event = new wakeUpEvent(System.currentTimeMillis(), "bed", this);// 传入this,事件原对象,供观察者使用。
    
            for(Observer o : observers) {
                o.actionOnWakeUp(event);
            }
        }
    }
    
    • 事件
    abstract class Event<T> {
        abstract T getSource();
    }
    
    class wakeUpEvent extends Event<Child>{
        long timestamp;
        String loc;
        Child source;
    
        public wakeUpEvent(long timestamp, String loc, Child source) {
            this.timestamp = timestamp;
            this.loc = loc;
            this.source = source;
        }
    
        @Override
        Child getSource() {
            return source;
        }
    }
    

    调用:

    public class Main {
        public static void main(String[] args) {
            Child c = new Child();
            //do sth
            c.wakeUp();
        }
    }
    

    相关文章

      网友评论

        本文标题:观察者模式

        本文链接:https://www.haomeiwen.com/subject/csbmxktx.html