手寫觀察者模式


經常向遇到有的面試官讓你手撕觀察者

 

模擬觀察者模式的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM