大飞

大飞 关注TA

挑战一切!

大飞

大飞

关注TA

挑战一切!

  •  世界的顶端
  • 混口饭吃
  • 写了333,609字

该文章投稿至Nemo社区   Java  板块 复制链接


设计模式三 观察者模式

发布于 2017/06/10 21:06 1,487浏览 0回复 2,725

        观察者模式归类为行为设计模式,观察者模式也叫做也叫作发布-订阅模式一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。

打个搞笑比方,警察抓小偷,警察是观察者, 小偷是被观察者,小偷出狱后,警察告诉小偷,你下次作案的时候,告诉我一声,我去抓你,小偷说,好啊。结果下次小偷作

案的时候,真的告诉警察了。

       下面用代码来实现一下:

第一步:分别创建被观察者接口和观察者接口

package com.example.fwms.designmode.observer;

/**
 * 创建 by 刘宇飞 on 2017/6/10.
 * 邮箱:3494576680@qq.com
 * 描述 观察者接口
 */

public interface Observer {
    void grabThief();
}
package com.example.fwms.designmode.observer;

/**
 * 创建 by 刘宇飞 on 2017/6/10.
 * 邮箱:3494576680@qq.com
 * 描述 被观察者接口
 */

public interface Observable {
    // 添加观察者
     void addObserver(Observer observer);
    // 删除观察者
     void removeObserver(Observer observer);
    // 通知观察者
     void notifyObservers();
}

第二步 实现接口编程 创建一个小偷 两个警察

package com.example.fwms.designmode.observer;

import android.util.Log;

import java.util.ArrayList;
import java.util.List;

/**
 * 创建 by 刘宇飞 on 2017/6/10.
 * 邮箱:3494576680@qq.com
 * 描述 小偷
 */

public class SillyThief implements Observable {
    private final String TAG=this.getClass().getName();
    private List<Observer> observerList = new ArrayList<>();
    @Override
    public void addObserver(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        if(observerList != null && observerList.contains(observer)){
            observerList.remove(observer);
        }
    }

    @Override
    public void notifyObservers() {
        Log.e(TAG,"我开始作案了,先告诉警察一声");
        for (Observer observer : observerList) {
            observer.grabThief();
        }
    }
}
package com.example.fwms.designmode.observer;

import android.util.Log;

/**
 * 创建 by 刘宇飞 on 2017/6/10.
 * 邮箱:3494576680@qq.com
 * 描述  男警察
 */

public class Policeman implements Observer {
    private final String TAG=this.getClass().getName();
    @Override
    public void grabThief() {
        Log.e(TAG,"我是男警察来抓你了");
    }
}
package com.example.fwms.designmode.observer;

import android.util.Log;

/**
 * 创建 by 刘宇飞 on 2017/6/10.
 * 邮箱:3494576680@qq.com
 * 描述 女警察
 */

public class Policewoman implements Observer{
    private final String TAG=this.getClass().getName();
    @Override
    public void grabThief() {
        Log.e(TAG,"我是女警察来抓你了");
    }
}

第三步 完成订阅关系

  private void observer() {
        //被观察者
        Observable thief=new SillyThief();
        //观察者
        Observer man=new Policeman();
        Observer woman=new Policewoman();
        //添加观察者
        thief.addObserver(man);
        thief.addObserver(woman);
        //通知被观察者
        thief.notifyObservers();

    }

打印log


GitHub地址

本文标签
 {{tag}}
点了个评