观察者模式

设计模式-观察者模式

本篇只作简要代码示例,不做“学术讨论”!


点击我,查看设计模式在项目中的应用

1. 观察者模式介绍

观察者又称:订阅-发布模式!

从生活中寻找观察者模式的示例,以通俗易懂的话语讲解“观察者模式”:微信公众号!

微信公众号:当我们关注某公众号时,我们就成为这个公众号的订阅者,这个公众号一旦有消息会执行发布,此时订阅者就会接收到发布信息。(消息推送也是如此,还有其他很多的示例就不一一列举)

想要实现一个简易的观察者模式?请往下看

2. 观察者模式实现

1. 思考观察者模式所具备的属性或特征

  1. 需要一个观察者、若干个订阅者!
  2. 观察者发布信息,订阅者接收信息!
  3. 订阅者可以订阅,订阅者可以取消订阅!
  4. 其他若干健壮性的设计,如:避免重复订阅,以及其他!

2. 代码实现

观察者

import android.support.annotation.Nullable;

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

/**
* <p>
* @author air.
* </p>
* <p>
* 拥有属性、标签:
* 观察者模式
* {@link #registerPushReceiver(IPushReceiver)}
* {@link #unRegisterPushReceiver(IPushReceiver)}
* {@link #notifyRegisterReceiver(PushPublish)}
* </p>
*/
public class PushManager {

    private static final List<IPushReceiver> mPushReceivers = new ArrayList<>();

    private PushManager() {

    }

    static class Holder {
        static final PushManager INSTANCE = new PushManager();
    }

    public static PushManager getInstance() {
        return Holder.INSTANCE;
    }

    /**
    * 绑定消息推送的订阅者
    *
    * @param registerReceiver 绑定的订阅者
    * @return 操作是否成功执行
    */
    boolean registerPushReceiver(@Nullable IPushReceiver registerReceiver) {
        if (registerReceiver == null) {
            return false;
        }

        if (mPushReceivers.contains(registerReceiver)) {
            //已经注册,则不许要再重复注册!
            return false;
        }
        //注册
        mPushReceivers.add(registerReceiver);
        return true;
    }

    /**
    * 解绑消息推送的订阅者
    *
    * @param unRegisterReceiver 解绑的订阅者
    * @return 操作是否成功执行
    */
    boolean unRegisterPushReceiver(@Nullable IPushReceiver unRegisterReceiver) {
        if (unRegisterReceiver == null) {
            return false;
        }
        if (!mPushReceivers.contains(unRegisterReceiver)) {
            //未注册,则不需要解绑注册!
            return false;
        }

        //解绑注册
        mPushReceivers.remove(unRegisterReceiver);
        return true;
    }

    /**
    * 通知订阅者数据需要更新
    *
    * @param pushPublish 更新的数据
    * @return 操作是否成功执行
    */
    boolean notifyRegisterReceiver(@Nullable PushPublish pushPublish) {
        if (pushPublish == null) {
            return false;
        }

        //制定统一的数据
        PushMessage pushMessageTemplate = new PushMessage();
        pushMessageTemplate.setMsg(pushPublish.getMsgTip());

        for (IPushReceiver receiver :
                mPushReceivers) {
            //另开数据传递给接收者
            PushMessage pushMessage = pushMessageTemplate;
            receiver.receiver(pushMessage);
        }
        return true;
    }

}

订阅者

/**
* <p>
* @author air.
* </p>
*/
public interface IPushReceiver {

    void receiver(PushMessage pushMessage);
}

观察者发布的消息(这里多个数据的中间处理操作)

import android.support.annotation.Nullable;

/**
* <p>
* @author air.
* </p>
*/
public class PushPublish {

    @Nullable
    private String id;
    @Nullable
    private String msgTip;

    public void setId(@Nullable String id) {
        this.id = id;
    }

    public void setMsgTip(@Nullable String msgTip) {
        this.msgTip = msgTip;
    }

    @Nullable
    public String getId() {
        return id;
    }

    @Nullable
    public String getMsgTip() {
        return msgTip;
    }
}

订阅者收到的消息

/**
* <p>
* @author air.
* </p>
*/
public class PushMessage {

    String msg;

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }
}

测试

/**
* <p>
* @author air.
* </p>
*/
public class PushTest {

    public static void main(String[] args){

        PushManager pushManager = PushManager.getInstance();

        //注册订阅者
        pushManager.registerPushReceiver(new IPushReceiver() {
            @Override
            public void receiver(PushMessage pushMessage) {
                System.out.printf(""+pushMessage.getMsg());
            }
        });


        //通知订阅者
        PushPublish publish = new PushPublish();
        publish.setId("ID");
        publish.setMsgTip("有新消息,请查收!");
        pushManager.notifyRegisterReceiver(publish);

    }
}

3. TODO

进一步扩充、丰富、完善相关内容!


未完待续。。。


   转载规则


《观察者模式》 Air 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录