工具类封装的思路 | 钉钉群机器人为例

大家好,我是小刀

大家好, 我是小刀,算起来好像有半个月没写文章了,是不是都快忘了我呀

这半个月虽然文章没写,但是鼓捣了不少工具类,搞着搞着发现,这些工具类虽然功能不一样,但是封装的思路和组织的方式很像,可以提炼出一些共同点出来, 这是很值得分享的事。

所谓授人以鱼,不如授人以渔,可能看我的文章,代码没学会几行,但相信我,学到的绝不止是代码

工具类案例

先看下我这段时间的成果(安装包还没在网上发布,可以找我拿安装包)

image.png

image.png

image.png

image.png

工具类源码示例

image.png

我选取了几个工具包展示出来,可以看到,一个工具的组成,大致由三种类组成: 1. xxxConfig. 2. xxxTools. 3.model 包,存放工具的请求/返回实体

我们以钉钉的工具包为例进行剖析:

DingConfig.java

public class DingConfig {
		// 钉钉添加机器人时获得的url
    private String url;
  	// 钉钉添加机器人时获取的secret
    private String secret;
		// 在原有的URL之上添加一些参数
    public String getUrl() {
        Long timestamp = System.currentTimeMillis();
        String sign = getSign(timestamp);
        return url+"&timestamp="+timestamp+"&sign="+sign;
    }

		
  	/**
  	* 通过时间戳和sercet进行加密.
  	*/
    public String getSign(Long timestamp) {
        try {

            String stringToSign = timestamp + "\n" + secret;
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
            byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
            return URLEncoder.encode(Base64.getEncoder().encodeToString(signData), "UTF-8");
        }catch (Exception e){
            return null;
        }
    }
}

如上所示,我们可以看到,这个配置类不仅仅是存一些值, 一些常用的和配置相关的功能也都在这里,这里有点像领域驱动的充血实体类的感觉了。

DingMessage.java 已精简掉相关的 get/set 方法

public class DingMessage {
		// 定义钉钉消息的类型,纯文字类型
    public static final String TYPE_TEXT="text";
		// 定义钉钉消息的类型,带按钮可跳转的类型
    public static final String TYPE_ACTION_CARD = "actionCard";

    private String  msgtype;

    private TextMessage text;

    private ActionCardMessage actionCard;
		
  	// 采用静态内部类的形式来组织嵌套的实体类
    static class TextMessage{
        private String content;

        public String getContent() {
            return content;
        }

    }
		// 采用静态内部类的形式来组织嵌套的实体类
    static class ActionCardMessage{
        private String title;
        private String text;
        private String hideAvatar;
        private String btnOrientation;
        private List<DButton> btns;
    }
  	// 采用静态内部类的形式来组织嵌套的实体类
    static class DButton{
        private String title;
        private String actionURL;
    }
		
  	// 对外提供的初始化函数,对外部看来,只需要传一个content就可以了
  	// 拼实体类的操作,放到了实体类里面
    public static DingMessage initTextMessage(String content){
        TextMessage textMessage = new TextMessage();
        textMessage.content = content;
        DingMessage dingMessage = new DingMessage();
        dingMessage.text = textMessage;
        dingMessage.msgtype = TYPE_TEXT;
        return dingMessage;
    }
   
}

通过我们和第三方都是通过 JSON 的方式进行交互。 要么就是 map 转 json,要么就是实体类转 json, 这里我都是使用的实体类转 json, 也没有拆分很多的实体类,直接通过静态内部类就可以完成实体的组织

DingTools.java

// 提供给外部使用的工具类 
public static void sendText(String content,DingConfig config){
  			// 构造请求实体类
        DingMessage message = DingMessage.initTextMessage(content);
  			// 转成json
        String s = JSON.toJSONString(message);
  			// 请求第三方
        HttpResponse<String> response = HttpTools.doPost(config.getUrl(),s , HttpRequest.JSON_HEADER, String.class);
  			// 处理返回值
        System.out.println(response.getBody());
    }

如上源码所示,真得到工具类里面大致分为四步, 构造请求实体类,转成 json,请求, 然后处理返回值,同样的去请求微信/redis,也大致都是这个结构

调用方

public static void main(String[] args) {
  			// 配置config
        DingConfig config = new DingConfig();
        config.setUrl("https://oapi.dingtalk.com/robot/send?access_token=xx");
        config.setSecret("xxxx");
      	// 调工具类
        DingTools.sendActionCard("测试审核","这是一条测试审核的信息",config);
    }

对调用方来说, 就两个事, 拼 Config , 然后调用工具类。 通过传入的 Config 不一样, 工具类可以操作不同主体的第三方, 这个跟所谓的无状态就很像了

总结

思路思路, 本篇文章只要强调的是思路, 大家以后在封装自己的工具类时,也可以考虑使用这样的结构, 一个 Config , 一个实体包, 一个 Tools. 这样对调用方和对自己来说,都很简单。

后记

现在还在武汉, 前段时间没写文章也是因为心一直悬着。 同样是在隔离, 在武汉隔离就像是摆在屠刀面前,看谁不幸被选中。 其间压力可想而知。虽然我也会和你们笑着说,我没事, 武汉很好, 其实...真得一点点都不好!!!非常不好!!!! 但大家也都是成年人了, 聊这个干嘛呢, 所以,我就做了这么一个小东东

couxin.jpeg

在这里,一切都是匿名的,有什么想法,抱怨,问题等等,都可以和大家来分享一下,不在乎有多少人回复,相信说出来的那一刻就轻松许多许多!

1585490881098.png

  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    13 引用 • 66 回帖 • 491 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    171 引用 • 492 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2674 引用 • 7947 回帖 • 779 关注
回帖
请输入回帖内容...