码迷,mamicode.com
首页 > 其他好文 > 详细

手写观察者模式

时间:2020-01-18 19:34:48      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:interface   observer   一句话   面试官   接口   inter   测试结果   print   upd   

经常向遇到有的面试官让你手撕观察者

 

模拟观察者模式的3个要点:

1.需要两个接口,观察者,和被观察者。
2.被观察者接口需要有两个方法, 一个是注册观察者方法,一个是通知观察者方法。
3.被观察者需要有一个集合,用于储存观察者,注册方法就是向集合里添加对象。通知方法就是遍历集合。

package com.DesignMode.Observer;

/**
 * 〈一句话功能简述〉;
 * 〈观察者抽象接口〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public interface Observer {

    public void update(int tmp);
}
package com.DesignMode.Observer;

/**
 * 〈一句话功能简述〉;
 * 〈被观察者接口〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public interface Subject {

    //注册观察者
    public void regist(Observer o);

    //移除观察者
    public void remove(Observer o);

    //通知观察者
    public void notifyObserver();
}
package com.DesignMode.Observer;

import java.util.ArrayList;

/**
 * 〈一句话功能简述〉;
 * 〈被观察者具体实现〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class Wheather implements Subject {

    private ArrayList<Observer> list = new ArrayList<>();

    private int tmp = 2;

    @Override
    public void regist(Observer o) {
        list.add(o);

    }

    @Override
    public void remove(Observer o) {
        list.remove(o);
    }

    @Override
    public void notifyObserver() {
        if(list != null && list.size() > 0) {
            for(int i=0;i<list.size();i++) {
                //遍历通知所有观察者
                list.get(i).update(tmp);
            }
        }
    }

    public void setTmp(int tmp) {
        this.tmp = tmp;
        notifyObserver();
    }
}
package com.DesignMode.Observer;

/**
 * 〈一句话功能简述〉;
 * 〈观察者1〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class Observer1 implements Observer {

    @Override
    public void update(int tmp) {
        System.out.println("Observer1:" + tmp);
    }
}
package com.DesignMode.Observer;

/**
 * 〈一句话功能简述〉;
 * 〈观察者2〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class Observer2 implements Observer {

    @Override
    public void update(int tmp) {
        System.out.println("Observer2:" + tmp);
    }
}

测试代码:

package com.DesignMode.Observer;

/**
 * 〈一句话功能简述〉;
 * 〈功能详细描述〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class TestObserver {

    public static void main(String[] args){
        Wheather w = new Wheather();
        Observer1 o1 = new Observer1();
        Observer2 o2 = new Observer2();
        w.regist(o1);
        w.regist(o2);

        w.setTmp(10);
    }
}

测试结果:

Observer1:10
Observer2:10

手写观察者模式

标签:interface   observer   一句话   面试官   接口   inter   测试结果   print   upd   

原文地址:https://www.cnblogs.com/jxxblogs/p/12209786.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!