設計模式之觀察者模式

觀察者模式又稱爲發佈訂閱模式,裏面角色分爲觀察者,被觀察者。被觀察者的動做會通知給註冊的觀察者。java

如今設計一個故事,監獄裏面有犯人和警察,警察會監控犯人的一舉一動。當犯人吃飯的時候,警察會收到通知。異步

1、簡單的觀察者實現:ide

Observable:
this

public abstract class Observable {
    private Vector<Observer> obs = new Vector<>();

    public void notifyObs(Object param) {
        for (Observer ob : obs) {
            ob.update(param);
        }
    }

    public void addObserver(Observer ob) {
        this.obs.add(ob);
    }

    public void removeObserver(Observer ob) {
        this.obs.remove(ob);
    }

    public int getObserverSize() {
        return this.obs.size();
    }

    public boolean containObserver(Observer ob) {
        return this.obs.contains(ob);
    }
}

Observer:
spa

public interface Observer  {
    void update(Object param);
}

Criminal:設計

public class Criminal extends Observable {
    public void eat(String food) {
        System.out.println("criminal is eating " + food);
        this.notifyObs(food);
    }
}

Police A:code

public class PoliceA implements Observer {
    @Override
    public void update(Object param) {
        System.out.println("police A get message. param is "  + param);
    }
}

Police B:server

public class PoliceB implements Observer {
    @Override
    public void update(Object param) {
        System.out.println("police A get message. param is "  + param);
    }
}

Test:繼承

public class Test {
    public static void main(String[] args) {
        Criminal criminal = new Criminal();
        criminal.addObserver(new PoliceA());
        criminal.addObserver(new PoliceB());
        criminal.eat("西餐");
    }
}

上面的代碼很是簡單,很容易看懂。Observable是對觀察者的抽象,裏面有個Vectory,放入的是觀察者。當有觀察者註冊的時候就放入到Vectory裏面。Crimimal繼承了Observable,當犯人吃飯的時候就依次通知Vectory裏面的觀察者。rem

JDK裏面自己就存在Observable和Observer兩個類,方便咱們直接使用觀察者模式。

2、使用JDK裏面觀察者的實現

Criminal:

public class Criminal extends Observable {

    public void eat(String food) {
        System.out.println("criminal eat " + food);
        super.setChanged();
        notifyObservers("criminal is eating " + food);
    }
}

Police A:

public class PoliceA implements Observer{
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Police A watch : " + arg);
    }
}

Police B:

public class PoliceB implements Observer {
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Police B watch . " + arg);
        System.out.println(o);
    }
}

Test:

public class Test {
    public static void main(String[] args) {
        Criminal criminal = new Criminal();
        criminal.addObserver(new PoliceA());
        criminal.addObserver(new PoliceB());
        criminal.eat("川菜");
    }
}


2、觀察者模式的缺點

  1. 當某些觀察者執行時間過長,會致使後面的觀察者過長的延遲.  

    解決辦法:使用異步處理,不管是在觀察者端通知的步驟使用異步仍是被觀察者收到通知而後執行的步驟使用異步,均可以.

  2. 觀察者同時也能夠是被觀察者。廣播鏈太長,可維護性不好。

相關文章
相關標籤/搜索