zoukankan      html  css  js  c++  java
  • 观察者模式

    用对象的方式解释观察者模式。

    定义一个事件: 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。

    解释:对象1观音菩萨,动作洒水,对象2观察者乌龟。代码中,会在观音菩萨中加一个字段,List<Observer> observers = new ArrayList<Observer>();   这个字段用来比作老乌龟的目光吧,观音的动作中

    public void setI(int i) {    this.i = i;  notifyAllObservers();}    这个表示的意思是在动作setI执行中加入一个传播方法,比如说观音洒水,这个动作通过光传播给乌龟,乌龟就过去了,那么这里设置i比作观音洒水,提醒观察者就比作光传播,

    private void notifyAllObservers() {
    for (Observer o: observers) {
    o.update();}}

    观察者里面的方法就可以执行了,乌龟就来了=update实际执行的意思就是

    @Override
    protected void update() {
    System.out.println("HexaObserver:"+Integer.toHexString(this.subject.getI()));}

    new HexaObserver(subject);  这句话则是hexa乌龟要观察subject观音 的动作,在代码中啊。整个逻辑用汉文整理一下。

    对了,还有attach这个动作,意思是在new 乌龟的时候,把乌龟attach到观音的字段observers中,表示了观音被哪些观察者监视

    实例化观音,实例化乌龟的时候添加乌龟要观察的对象,也就是观音,观音的setI动作=观音洒水,洒水的动作中,植入notifyall,将观音的实例属性观察者observers全部遍历,执行乌龟飞向菩萨的动作=observer.update(),这就完成了观音洒水,乌龟飞过去这个观察者模式的代码逻辑解读。

    稍后附上代码。

    public class TortoisObserverDemo {
        public static void main(String[] args){
            GuanYin guanYin = new GuanYin();
    
            new SmallTortoise(guanYin);
            new BigTortoise(guanYin);
    
            guanYin.watering();
        }
    }
    TortoisObserverDemo
    public class GuanYin {
        private List<Observer> observers = new ArrayList<Observer>();
    
        public void watering(){
            System.out.println("观音洒水");
            notifyAllTortoise();
        }
    
        private void notifyAllTortoise() {
            int i = 0;
            for (Observer o:observers) {
                o.flyToGuanYin();
                System.out.println(++i);
            }
        }
    
        public void attach(Observer observer) {
            observers.add(observer);
        }
    }
    GuanYin
    public abstract class Observer {
        protected GuanYin guanYin;
        protected abstract void flyToGuanYin();
    }
    Observer
    public class SmallTortoise extends Observer {
    
        public SmallTortoise(GuanYin guanYin) {
            this.guanYin = guanYin;
            this.guanYin.attach(this);
        }
    
        @Override
        protected void flyToGuanYin() {
            System.out.println("SmallTortoise fly to guanyin");
        }
    }
    SmallTortoise
    public class BigTortoise extends Observer {
    
        public BigTortoise(GuanYin guanYin) {
            this.guanYin = guanYin;
            this.guanYin.attach(this);
        }
    
        @Override
        protected void flyToGuanYin() {
            System.out.println("BigTortoise fly to guanyin");
        }
    }
    BigTortoise
  • 相关阅读:
    [置顶] java 通过classloader加载类再通过classforname实例化
    Linux内核源代码解析——用户发送数据包的起源之sendto
    POJ 2774 Long Long Message&&HDU 1403 Longest Common Substring&&COJ 1203
    add-two-numbers-ii
    【转载】React初学者入门须知
    【Todo】【转载】ES6的学习记录
    【转载】Java中如何写一段内存泄露的程序 & ThreadLocal 介绍和使用
    【Todo】深入理解Javascript系列
    【转载】什么是优秀技术团队
    【转载】React入门-Todolist制作学习
  • 原文地址:https://www.cnblogs.com/woainixxx/p/10880582.html
Copyright © 2011-2022 走看看