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

1. 观察者模式

观察者模式属于设计模式中的行为型模式,主要用于对象间存在一对多的关系的时候。

  • 作用:在一对多的对象关系中,当主对象的状态发生改变时,所有依赖于它的对象都将会被自动更新并得到通知。
  • 解决的问题:向其它对象通知主对象的改变。
  • 何时使用:当主对象的状态发生改变时,所有依赖于它的对象都将得到通知。
  • 使用场景:
    • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
    • 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
    • 一个对象必须通知其他对象,而并不知道这些对象是谁。
    • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

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

原文地址:https://www.cnblogs.com/jlcs/p/9845083.html

时间: 2024-07-31 17:25:07

观察者模式:以微信公众服务为例的相关文章

微信公众服务号开发

1 公司提供接口,微信平台可以通过访问我们的接口,进行数据交互,通过xml. 2 http://mp.weixin.qq.com/ 微信服务号平台,输入用户名密码进入高级功能-开发者模式, 3 申请服务号之后,微信会提供appid和AppSecret两个参数,根据这两个参数可以获取token,token作为你服务号和微信交互的证明. 4 接下里就是完成自己的接口部分的开发,然后接口的服务器配置地址输入微信服务号的服务器配置url,本地的项目地址是不行的,得是能访问的地址 5 接口的开发,接受xm

微信公众服务号申请、认证(开通支付)-微信开发图文教程

微信公众服务号申请 百度图文教程 http://jingyan.baidu.com/article/e9fb46e190a51a7521f766d7.html 微信服务号认证(开通支付) 百度图文教程 http://jingyan.baidu.com/article/cd4c2979cd8369756e6e60e0.html 比百度更详细的教程 http://www.ivlian.com/index!newsDetail.action?id=40 版权声明:本文为博主原创文章,未经博主允许不得转

卡券核销助手微信公众服务号全面升级 并更名为“卡券商户助手”

微信公众平台最近可谓动作频频,自动回复支持插入微信卡券 多图文消息可嵌入卡券,微信公众号支付测试功能策略调整 加快商户申请速度,新增"微信连Wi-Fi"功能,势为不太理想的双十一战绩扭转局势,微信卡券是微信支付(微信电商)重要一环,不断升级更新中,作为公众平台官方为卡券商户提供的服务号“卡券核销助手”昨天发布升级公告,更好地帮助商户在手机端进行卡券核销. 卡券核销助手全面升级 “卡券核销助手”是公众平台官方为卡券商户提供的服务号,帮助商户在手机端进行卡券核销. 卡券核销助手自上线以来,

以海尔微信公众号为例:微商城开发怎么撩用户

海尔兄弟想必大家都知道(卖冰箱的),嗯,在小编眼里,的确是个卖冰箱的.能将卖冰箱的形象做到深入人心,也是很成功的了.在这个微信商城开发的时代,海尔也有自己的微信公众号.重点是,海尔的微信公众号的运营不仅颠覆了大家对内容营销的看法,还做得特别成功! 很多商家也有自己的微信公众号,但是在做内容的时候,总是不得要领.具体表现在粉丝数量上不去,或者粉丝数量上去了但活跃度不足.这是一个讲究拉新留存促活的时代,可见用户的存在有多大的意义.所以,为嘛海尔可以做得很好?小编特意去扒拉了下海尔的微信公众号,然后它

微信公众服务号怎么做才能突破群发次数/月?

不少影楼企业在注册公众号,不知道是做订阅号还是服务号?若做订阅号,曝光度不够(微信改版后,订阅号的消息被折叠在订阅号列表中,曝光度大大降低),若做服务号,群发频次太低影响力有限(每月只能发四次,明显不够用),群发频率少,群发模板缺少新意,涨粉毫无头绪,怎么办? 要解决这个问题还得从公众号群发频率,或者跟粉丝互动几大方式来研究,可以试试模板消息. 首先要强调的一点是订阅号没有模板消息功能,只有认证过的服务号可以申请开通模板消息,不过除有自主开发能力以外,模板消息功能使用只能借助与第三方工具,使用时

java 微信公众服务平台 下发 模板消息

(一).部分截图 (二).部分代码 (一).部分截图: (二).部分代码: //此处 给用户微信发消息... Map<String,String> paraMap = new HashMap<String,String>(); String pk_paydata = (String)curDataMap.get("pk_paydata"); String personname = (String)curDataMap.get("personname&q

微信公众服务响应脚本

很简单的被动回复脚本: 一般我们都用sdk: https://github.com/dodgepudding/wechat-php-sdk,自己写也是极好的, <?php // 微信与服务器通信安全监测 class wechatCallbackapiTest{ public function valid(){ $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature())

基于微信公众服务号的电商平台开发环境搭建

      1-运行环境及开发工具 1.1 Java运行环境 安装与配置 1.1.1 JDK 安装与配置 1.1.2 IDE 开发环境安装与配置 1.2 数据库安装与配置 1.2.1MYSQL安装 用户名 密码 1.2.2 数据库管理工具 SQLyog 1.3 应用服务器安装与配置 1.3.1 TOMCAT安装与配置 1.3.2 应用程序部署与测试 2-

微信公众平台服务号与订阅号区别详解【有图】

微信公众平台现在分为两个类别的号:一个是服务号,一个订阅号.服务号是针对企业的,订阅号是针对个人的.这个两种类型的号有很大的区别,特别是功能上有所不同. 工具/原料 电脑.微信公众平台 微信公众平台服务号与订阅号"首页"区别 1 微信公众平台服务号首页面:主要的标志是:服务号 其他的和订阅号一样.如下图所示: 2 微信公众平台订阅号首页面:主要的标志是:订阅号 其他的和服务号一样.如下图所示: 3 微信公众平台服务号与订阅号进入的首页界面是一样的,主要的区别就是标志不一样,明确指出所登