我眼中的观察者模式

什么时候需要用到观察者模式

当有一个数据的改变会影响到很多模块的时候。我的理解是这样的,正常的编程过程中经常会使用setListener这种方式,功能类会在合适的时候来调用这个listener。这个关系是一对一的,一个功能类变化了,然后调用一个listener.如果是一个多呢,一个功能类变化了,要刷新多个其它呢?这就是观察模式的来源了。
观察者模式也叫订阅模式,订阅这个动作让我们更好的理解。你订阅了一份报纸,报社就知道你订阅了,每天报纸有新的内容了就送上门来,你需要查看报纸。订阅了一个电影网站,网站就会知道你订阅了,有新的电影了网站就会发邮件到你邮箱里面,你需要查看邮箱。这里就慢慢清晰了,有一个被观察者,一个观察者。被观察者可以发布更新通知,观察者可以响应更新通知。

类图

为了在使用的过程中更加的贴合实际。被观察者还需要有取消和增加观察者的能力,就像报纸可以订阅,也可以取消订阅一样。

那么类图的第一步。简单的通知和刷新。

类图1

增加一个取消和订阅的能,就是完善的观察者模式了

类图2

代码表示

抽象观察者

public interface Observer {

    public void update(String str);
}

抽象被观察者

public interface Observed {

    public void notifyToOberser();

    public void attachObserver(Observer observer);

    public void detachObserver(Observer observer);
}

具体观察者

public class ConcreteObserver implements Observer{

    @Override
    public void update(String str) {
        // TODO Auto-generated method stub
        Log.d("观察者"+this.hashCode()+"  收到消息: "+str+" 我假装工作");
    }

}

具体被观察者

public class ConcreteObserved implements Observed{

    ArrayList<Observer> mList = new ArrayList<>();
    String mStr;

    @Override
    public void notifyToOberser() {
        // TODO Auto-generated method stub
        for(Observer observer : mList) {
            observer.update(mStr);
        }
    }

    @Override
    public void attachObserver(Observer observer) {
        // TODO Auto-generated method stub
        mList.add(observer);
        Log.d("被观察者  观察者"+observer.hashCode()+" 订阅我了");
    }

    @Override
    public void detachObserver(Observer observer) {
        // TODO Auto-generated method stub
        mList.remove(observer);
        Log.d("被观察者 观察者"+observer.hashCode()+" 取消订阅我");
    }


    public void setString(String str) {
        mStr = str;
        notifyToOberser();
    }
}

使用实例

    ConcreteObserved concreteObserved = new ConcreteObserved();

    ConcreteObserver concreteObserver = new ConcreteObserver();

    concreteObserved.attachObserver(concreteObserver);

    concreteObserved.setString("老板来了");

    concreteObserved.detachObserver(concreteObserver);

    concreteObserved.setString("老板来了");

为了更好的查看,以代码的方式进行了记录.详情请查看DesignPattern中的 com.arron.pattern.observer下的内容.戳我查看详情

猜你喜欢

转载自blog.csdn.net/xjz729827161/article/details/78196688