您的位置:首页 > 移动开发 > Android开发

设计模式之观察者模式(Observer pattern)

2016-05-12 11:27 676 查看
观察者模式(Observer pattern)

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.

应用场景:

一、 对一个对象状态的更新,需要其他对象同步更新,而且其他

          对象的数量动态可变。

二、 对象仅需要将自己的更新通知给其他对象而不需要知道其他    

          对象的细节。

源码如下:

//抽象主题角色类

abstract class Subject {

    private List list = new ArrayList<>();

    public void attach(Observer observer) {

        list.add(observer);

    }

    public void detach(Observer observer) {

        list.remove(observer);

    }

    public void notifyObservers(String newState) {

        for (Observer observer : list) {

            observer.update(newState);

        }

  }

}

//具体主题角色类

class SDKDownloadSubject extends Subject {

    public void netProcessChange(String data) {

        this.notifyObservers(data);

    }

}

//抽象观察者角色类

interface Observer {

    void update(String state);

}

//具体观察者角色类

class ProgramMonkeyObserver implements Observer {

    @Override

    public void update(String state) {

        System.out.println(Programer look the SDK download process is: +state);

    }

}

//客户端

public class Main {

    public static void main(String[] args) {

        SDKDownloadSubject sdkDownloadSubject = new SDKDownloadSubject();

        Observer observer = new ProgramMonkeyObserver();

        sdkDownloadSubject.attach(observer);

        sdkDownloadSubject.netProcessChange(1%);

        sdkDownloadSubject.netProcessChange(51%);

        sdkDownloadSubject.netProcessChange(100%);

    }

}

观察者模式的优点:

1、 Subject和Observer之间是松偶合的,分别可以各自独立改变。

2、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。

3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性,极易造成对象间的高度耦合,从而降低了可重用性。

观察者模式的缺陷:

1、 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题,耗时。(毕竟只是简单的遍历),观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息