观察者模式

    xiaoxiao2021-03-25  46

      定义如下。   观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自己更新自己。   一开始我们可能写出下面这样的代码:   被观察者的代码(就是上面说的某个主题对象):

    import java.util.LinkedList; import java.util.List; public class ConcreteObservable { private List<ConcreteObserver> mConcreteObserverList; public ConcreteObservable() { mConcreteObserverList = new LinkedList<>(); } public void addObserver(ConcreteObserver observer) { mConcreteObserverList.add(observer); } public void deleteObserver(ConcreteObserver observer) { mConcreteObserverList.remove(observer); } public void notifyObservers() { for (int i = 0;i < mConcreteObserverList.size();i++) { mConcreteObserverList.get(i).update(this); } } }

      观察者的代码:

    public class ConcreteObserver { public void update(ConcreteObservable observable) { System.out.println(this + "说:" + observable + "有通知了。"); } }

      测试代码:

    public class Test1 { public static void main(String[] args) { ConcreteObservable concreteObservable = new ConcreteObservable(); ConcreteObserver concreteObserver1 = new ConcreteObserver(); ConcreteObserver concreteObserver2 = new ConcreteObserver(); ConcreteObserver concreteObserver3 = new ConcreteObserver(); concreteObservable.addObserver(concreteObserver1); concreteObservable.addObserver(concreteObserver2); concreteObservable.addObserver(concreteObserver3); concreteObservable.notifyObservers(); } }

      结果:

    ConcreteObserver@5cad8086说:ConcreteObservable@6e0be858有通知了。 ConcreteObserver@61bbe9ba说:ConcreteObservable@6e0be858有通知了。 ConcreteObserver@610455d6说:ConcreteObservable@6e0be858有通知了。

      上面的代码几乎没有可扩展性,比如如果观察者不只一种,有非常多种,而它们可能就是有个update()方法一样。所以可以用个接口,将观察者抽象出来,具体改动后的代码如下:   抽象观察者接口:

    public interface Observer { void update(ConcreteObservable observable); }

      具体观察者一:

    public class ConcreteObserverOne implements Observer { @Override public void update(ConcreteObservable observable) { System.out.println(this + "说:" + observable + "发通知了,我要去搬砖了。"); } }

      具体观察者二:

    public class ConcreteObserverTwo implements Observer { @Override public void update(ConcreteObservable observable) { System.out.println(this + "说:" + observable + "发通知了,我要去打酱油了。"); } }

      具体观察者三:

    public class ConcreteObserverThree implements Observer { @Override public void update(ConcreteObservable observable) { System.out.println(this + "说:" + observable + "发通知了,我要去打睡觉了。"); } }

      被观察者的代码:

    import java.util.LinkedList; import java.util.List; public class ConcreteObservableOne implements Observable { private List<Observer> mConcreteObserverList; public ConcreteObservableOne() { mConcreteObserverList = new LinkedList<>(); } public void addObserver(Observer observer) { mConcreteObserverList.add(observer); } public void deleteObserver(Observer observer) { mConcreteObserverList.remove(observer); } public void notifyObservers() { for (int i = 0;i < mConcreteObserverList.size();i++) { mConcreteObserverList.get(i).update(this); } } }

      测试代码:

    public class Test1 { public static void main(String[] args) { ConcreteObservable concreteObservable = new ConcreteObservable(); Observer concreteObserverOne = new ConcreteObserverOne(); Observer concreteObserverTwo = new ConcreteObserverTwo(); Observer concreteObserverThree = new ConcreteObserverThree(); concreteObservable.addObserver(concreteObserverOne); concreteObservable.addObserver(concreteObserverTwo); concreteObservable.addObserver(concreteObserverThree); concreteObservable.notifyObservers(); } }

      结果:

    ConcreteObserverOne@5cad8086说:ConcreteObservable@6e0be858发通知了,我要去搬砖了。 ConcreteObserverTwo@61bbe9ba说:ConcreteObservable@6e0be858发通知了,我要去打酱油了。 ConcreteObserverThree@610455d6说:ConcreteObservable@6e0be858发通知了,我要去打睡觉了。

      当然,你还可以更彻底点,再用接口弄个抽象的被观察者Observable:

    public interface Observable { void addObserver(Observer observer); void deleteObserver(Observer observer); void notifyObservers(); }

      剩下的代码就不贴了,上面看懂了,应该很容易写了。      这样就很好的对代码进行解耦了,也很好的体现了依赖倒置原则。(所谓依赖倒置原则(Dependence Inversion Principle )就是要依赖于抽象,不要依赖于具体。)

    转载请注明原文地址: https://ju.6miu.com/read-35006.html

    最新回复(0)