java微信关注事件_java策略模式在接收微信事件推送上的具体应用

article/2025/10/4 17:33:09

java策略模式,在我的认知中是根据不同选择执行不同的实现。通过if或者switch-case也能实现这种逻辑,但是代码冗余,可扩展性不强。

百度百科上的解释为策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

这里我只是分享一下我在接收微信事件推送上使用策略模式的方法。接触过微信开发的都清楚,微信所有的事件推送只能推送到我们填写的那个接口,我们需要不同的事件执行不同的逻辑。这个时候策略模式都优势就展现出来了。

以下是具体实现:

2接收到的参数一般都是xml格式的我们先将xml解析成map。(工程需引入 org.dom4j 2.1.1)

import java.io.IOException;

import java.io.InputStream;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

/**

* XML解析

*/

public class XmlConvert {

/*

* XML转map

*/

public static Map xmlToMap(InputStream ins) {

HashMap map = null;

try {

map = new HashMap();

SAXReader reader = new SAXReader();

Document doc = reader.read(ins);

Element root = doc.getRootElement();

List list = (List) root.elements();

for (Element e : list) {

map.put(e.getName(), e.getText());

}

ins.close();

} catch (DocumentException |IOException e) {

e.printStackTrace();

}

return map;

}

}

3定义事件处理接口与方法

c343e1dd4e7f98ee205e2bd296276abd.png

目录结构

3.1定义策略接口

import java.util.Map;

/**

* 微信事件处理接口 策略模式

*/

public interface ICallBackService {

/**

* 响应事件

* @return

*/

public Map Event(Map eventMap);

}

3.2 定义策略接口的实现,选择几个常用的微信事件做样例

import 自己的包路径.ICallBackService;

import org.springframework.stereotype.Service;

import java.util.Map;

/**

* 点击按钮事件

*/

@Service

public class Click implements ICallBackService {

@Override

public Map Event(Map eventMap) {

System.out.println("Click");

return null;

}

}

import 自己的包路径.ICallBackService;

import org.springframework.stereotype.Service;

import java.util.Map;

/**

* 关注事件

*/

@Service

public class Subscribe implements ICallBackService {

@Override

public Map Event(Map eventMap) {

System.out.println("Subscribe");

return null;

}

}

import 自己的包路径.ICallBackService;

import org.springframework.stereotype.Service;

import java.util.Map;

/**

* 取消关注事件

*/

@Service

public class Unsubscribe implements ICallBackService {

@Override

public Map Event(Map eventMap) {

System.out.println("Unsubscribe");

return null;

}

}

import 自己的包路径.ICallBackService;

import org.springframework.stereotype.Service;

import java.util.Map;

/**

* 点击视图菜单事件

*/

@Service

public class View implements ICallBackService {

@Override

public Map Event(Map eventMap) {

System.out.println("View");

return null;

}

}

4根据微信推送事件类型选择具体实现

import 自己的包路径.ICallBackService; // 事件接口

import 自己的包路径.XmlConvert; // xml转map

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.util.List;

import java.util.Map;

/**

* 接收微信事件推送接口

* get 和 post 方法访问路径一定要一致。

*/

@RestController

@RequestMapping("weixinCallBack")

public class WeiXinCallbackController {

@Autowired

private List callBackServices; //以集合的方式自动注入接口

/**

* 接收消息推送

* 一定要使用【post】方式

*

* @param request

* @param resp

* @return

*/

@PostMapping(value = "/callBack")

public Boolean callBack(HttpServletRequest request, HttpServletResponse resp) {

try {

// 将输入xml流转换为Map方便取值

Map dataMap = XmlConvert.xmlToMap(request.getInputStream());

for (ICallBackService callBackService : callBackServices) {

// 更具事件名称使用事件接口的具体实现

// Event 是微信的事件类型,事件类型与我们的接口实现名称一致,判断都统一转成大写

if (callBackService.getClass().getSimpleName().toUpperCase().equals(dataMap.get("Event").toUpperCase())) {

// 执行事件方法

callBackService.Event(dataMap);

break;

}

}

} catch (IOException e) {

e.printStackTrace();

}

// 返回给微信,如果没有返回微信会重试几次

return true;

}

}

在本地实际操作输出以下内容

d424613d8d0779ce44cf75a7ef9203d5.png

至此通过策略模式在接收微信公众号事件推送上的具体运用就结束了。具体的每种事件的逻辑可以在自己的实现层去完成,通过策略模式扩展了代码的可维护性,添加新的事件也不用去控制层添加东西。

策略模式在各个地方说的都比较多,但是实际的使用一般说的比较少。重点是策略模式的理解,难点在于策略模式的具体实现与具体运用。

欢迎大家一起交流IT技术  2742389525@qq.com 一个2015年入坑的无聊的java工程师


http://chatgpt.dhexx.cn/article/eSmYsF0I.shtml

相关文章

Java设计模式之3种策略模式实现

一、什么是策略模式 所谓策略模式,就是定义了一组策略,分别封装在不同类中,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者。比如我们要去某个地方,会根据距离的不同来选择不同的出行方式&…

java8 策略模式_JAVA设计模式之策略模式

策略模式:在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对…

git如何提交代码

代码提交 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 1. 查看目前代码的修改状态 提交代码之前,首先应该检查目前所做的修改,运行git status命令 a)…

修改git提交时间

问题描述: 修改git提交记录的时间 git脚本: 此方法使用github上的开源工具完成。感谢无私的奉献者! 操作步骤: github上下载文件 解压文件夹,把git-redate文件置于git安装目录的\mingw64\libexec\git-core文件夹…

git提交时常用命令

git提交时常用命令 一、git命令 -- 本地仓库与远程仓库建立链接 git init (初始化本地仓库) git remote add origin 远程仓库网址 git remote -v (查看远程仓库) git remote rm origin (删除远程分支)-- checkout多种用法 git checkout 文件名 &#…

git提交分支

1. git提交分支相关 在本地新建分支,保证和远程分支一样 git checkout -b 分支名如果分支已存在,只需要切换的话 git checkout 分支名提交前先把代码拉下来更新一下,确保不会覆盖别人的代码 git pull origin 远程分支(如果有)解决冲突 git …

Git 的提交

1 提交对象 理解Git分支,就需要了解提交及在提交过程中产生的提交对象(commit object)。在进行提交时Git会存储一个提交对象,其中包含一个指针,它指向此次提交时暂存内容的快照。除此之外,提交对象中还包含…

git代码提交

代码提交 代码提交一般有五个步骤: 1.查看目前代码的修改状态 2.查看代码修改内容 3.暂存需要提交的文件 4.提交已暂存的文件 5.同步到服务器 1. 查看目前代码的修改状态 提交代码之前,首先应该检查目前所做的修改,运行git status命令 a…

【git提交】流程

1- git提交(分支合并)操作流程: git 提交代码到自己的分支,并合并到主分支的完整流程 分支 sml , 主分支, master 分支msl上操作 git status git add . git commit -m ‘xxxxxx’ git pull origin master…

git提交规范,规范自己的提交标准

为了规范我的git提交内容,提交的时候commit -m “备注的信息”,但是每个人的备注信息千奇百怪,为了统一,我们进行了git的规范。 首先要全局安装commitizen npm i -g commitizen4.2.4然后安装插件 npm i cz-customizable6.3.0…

git提交常用命令

git 安装 1.在终端,检查git是否安装 git --version 2.没有安装的话,去git官网,下载git 3.安装后,在终端,检查git是否安装 4设置用户名和邮件地址(最好和github的用户名/邮箱保持一致 git config -…

Git 提交规范

1. 背景 Git 是目前世界上最先进的分布式版本控制系统,在我们平时的项目开发中已经广泛使用。而当我们使用Git提交代码时,都需要写Commit Message提交说明才能够正常提交。 git commit -m "提交"然而,我们平时在编写提交说明时&a…

git 提交命令(附加git常用命令)

一、提交到git仓库 1、进入git终端、输入git init指令、会在当前目录生成一个.git的文件夹 git init2、然后通过git status 查看,该指令作用是 列出修改过的(绿色标识)、新创建的(红色标识)、已经暂存但未提交的文件(白色标识) git status3、然后通过git add ind…

git提交

Git提交代码步骤 1.1 第1步:同步远程仓库代码:git pull 提交代码第1步:git pull 同步远程仓库代码到本地 git add / git commit代码之前首先git pull,需先从服务器上面拉取代码,以防覆盖别人代码;如果有…

你真的了解单点登录(SSO)吗? 单点登录实现方式

在程序开发中,特别是网站类开发,会接触到单点登录(SSO),什么是单点登录?单点登录(SSO)有什么用?下面就来详细介绍一下。 1 单点登录 1.1 什么是单点登录 单点登录的英文名叫做:Single Sign On&#xff0…

单点测试与多点测试

最近在使用PAT与Codeup写程序玩,发现这两者的OJ方式不同。 PAT是单点测试,即输入一组测试用例即可输出结果, 而Codeup是多点测试,即输入所有测试用例后才会输出所有输出结果。 在这里写两个最简单的ab求和小程序来说明二者的区别…

什么是单点登录?如何理解单点登录

什么是单点登录? 什么是单点登录? 因为讲了Cookie,讲了Session,这里我觉得有必要说一下单点登录。我们先来看一下什么是单点登录:单点登录(Single Sign On),简称为 SSO,…

单点登录和多点登录

SSO(单点登录)的概念:在一个多系统共存的环境下,用户在一处登录后,就不用再其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。 SSO(单点登录)的应用场景:…

OAuth2.0 实现单点登录

文章目录 OAuth2.0 实现单点登录一、四种授权模式二、搭建验证服务器三、使用 Postman 接口测试四、基于 EnableOAuth2Sso 实现五、基于 EnableResourceServer 实现 🚩🍬5.1 资源服务器🍬5.2 客户端访问🍬5.3 解决远程调用 六、使…

单点登录(SSO)-- 实现单点登录的几种方式

1.为什么需要单点登录 三个角度: 1.1 方便用户的使用:用户登录一次,可以使用不同的服务和页面,省了忘记密码的痛苦1.2 简化开发:SSO让开发人员只要开发一个通用的身份验证框架,就不用为身份验证操心了1.3 …