观察者模式:以微信公众服务为例

时间:2018-10-24 20:27:25   收藏:0   阅读:230

1. 观察者模式

观察者模式属于设计模式中的行为型模式,主要用于对象间存在一对多的关系的时候。
2.在微信公众服务中的实现示例
subject.java 主对象接口
package com.example.jingbin.designpattern.observer.interfaces;


/**
 * Created by jingbin on 2016/10/21.
 * 专题接口,所有的主题必须实现此接口
 */
public interface Subject {

    /**
     * 注册一个观察者
     */
    public void registerObserver(Observer observer);

    /**
     * 移除一个观察者
     */
    public void removeObserver(Observer observer);

    /**
     * 通知所有观察者
     */
    public void notifyObservers();
}

  

ObjectFor3D.java 实现主对象
技术分享图片
package com.example.jingbin.designpattern.observer.classs;

import com.example.jingbin.designpattern.observer.interfaces.Observer;
import com.example.jingbin.designpattern.observer.interfaces.Subject;

import java.util.ArrayList;

/**
 * Created by jingbin on 2016/10/21.
 * 接下来3D服务号的实现类:
 */

public class ObjectFor3D implements Subject {

    private ArrayList<Observer> observers = new ArrayList<>();

    /**
     * 3D 彩票的号码
     */
    private String msg;

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        int index = observers.indexOf(observer);
        if (index >= 0) {
            observers.remove(index);
        }
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(msg);
        }
    }

    /**
     * 主题更新信息
     */
    public void setMsg(String msg) {
        this.msg = msg;
        notifyObservers();
    }
}

  

技术分享图片
Observer.java 观察者接口
package com.example.jingbin.designpattern.observer.interfaces;

/**
 * Created by jingbin on 2016/10/21.
 * 所有观察者需要实现此接口
 */
public interface Observer {

    public void update(String msg);
}

  

技术分享图片
ObserverUser1.java 第一个观察者的实现
package com.example.jingbin.designpattern.observer.classs;

import android.util.Log;

import com.example.jingbin.designpattern.observer.interfaces.Observer;
import com.example.jingbin.designpattern.observer.interfaces.Subject;

/**
 * Created by jingbin on 2016/10/21.
 * 模拟第一个使用者
 */

public class ObserverUser1 implements Observer {

    public ObserverUser1(Subject subject) {
        subject.registerObserver(this);
    }

    @Override
    public void update(String msg) {
        Log.e("-----ObserverUser1 ", "得到 3D 号码:" + msg + ", 我要记下来。 ");
//        Toast.makeText(PatternApplication.getInstance(), "-----ObserverUser1 得到 3D 号码:" + msg, Toast.LENGTH_SHORT).show();
    }
}

  

ObserverUser2.java 第二个观察者的实现
package com.example.jingbin.designpattern.observer.classs;

import android.util.Log;

import com.example.jingbin.designpattern.observer.interfaces.Observer;
import com.example.jingbin.designpattern.observer.interfaces.Subject;

/**
 * Created by jingbin on 2016/10/21.
 * 模拟第二个使用者
 */

public class ObserverUser2 implements Observer {

    public ObserverUser2(Subject subject) {
        subject.registerObserver(this);
    }

    @Override
    public void update(String msg) {
        Log.e("-----ObserverUser2 ", "得到 3D 号码:" + msg + ", 我要告诉舍友们。");
//        Toast.makeText(PatternApplication.getInstance(), "-----ObserverUser2 得到 3D 号码:" + msg, Toast.LENGTH_SHORT).show();
    }
}

  

技术分享图片
测试
 // 创建服务号
 objectFor3D = new ObjectFor3D();
 // 创建两个订阅者
 observerUser1 = new ObserverUser1(objectFor3D);
 observerUser2 = new ObserverUser2(objectFor3D);
 // 两个观察者,发送两条信息
 objectFor3D.setMsg("201610121 的3D号为:127");
 objectFor3D.setMsg("20161022 的3D号为:000");

  

技术分享图片
运行结果
技术分享图片
 
技术分享图片
技术分享图片
 
技术分享图片
 
如上所示,观察者模式实现了当主对象改变时,其它对象都将会被自动更新
3. 观察者模式的优点和缺点
 
 
 
 
 
本文所引用的github地址:https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/observer
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!