链式调用原理及在框架中的用法

1.什么是链式调用?

Person person = new Person().setName(fog)
                            .setAge(18)
                            .setSex(man)
                            .setJob(software engineer);

2.优势和好处

有以上的代码,好处显而易见:代码量大幅度减少,逻辑集中清晰明了,且易于查看和修改。

3.实现原理

一般而言,我们在设置set,get的方法的时候,在对应的方法里都是返回的void。

从某种意义上来说,代码的返回值是一个必须要执行的步骤,直接返回void是一种浪费,而我们实现链式调用的关键步骤和原理就是这个返回值的不同。

public class Person {
    private String name;
    private String sex;
    private String job;
    private int age;
 
    public Person setJob(String job) {
        this.job = job;
        return this;
    }
 
    public Person setName(String name) {
        this.name = name;
        return this;
    }
 
    public Person setSex(String sex) {
        this.sex = sex;
        return this;
    }
 
    public Person setAge(int age) {
        this.age = age;
        return this;
    }
}

解析:

开始的那一串链式设置属性的实现代码,正是上面的形式。

对比而言,就是返回值的不同,一个是void,一个是this。

而实现链式调用的逻辑就是:

1.对于第一个设置属性的方法而言,新建一个对象的时候,正常的调用其方法,如果这个方法返回的是this,意味着将这个设置过属性的对象返回

2.那么对于第二个方法而言,是一个设置方法返回的是已经设置过属性的对象,而这个返回的对象也是有对应的属性设置方法的,这样一来,就相当于对一个创建的对象调用其属性设置方法,并且将这个对象返回

3.以此类推,上一个方法返回对象,是下一个调用方法的执行对象,依次执行下去,就成了链式调用方法

4.常见用法

①简化服务层调用DAO层代码

在前端向后端发送请求的时候,要将控制层的参数在服务层转换成map对象,可以自定义一个类,通过链式调用简化代码,然后在Dao层一律用map

自定义链式调用类

package com.yanzhen.utils;

import java.util.HashMap;
import java.util.Map;

public class MapParameter {
    private Map<String, Object> param = new HashMap<>();

    private MapParameter() {

    }

    public static MapParameter getInstance() {
        return new MapParameter();
    }

    public MapParameter add(String key,Object value) {
        param.put(key, value);
        return this;
    }
    public MapParameter addId(Object value) {
        param.put("id",value);//这个是MapParameter这个类的属性集合
        return this;//这个意思是返回MapParameter的这个类的一个实例
    }

    public MapParameter add(Map<String, Object> map) {
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            param.put(entry.getKey(), entry.getValue());
        }
        return this;
    }

    //把类的属性作为返回值
    public Map<String, Object> getMap() {
        return param;
    }


}

 控制层代码

 @PostMapping("/detail/{id}")
    @ResponseBody
    public Map<String,Object> detail(@PathVariable Integer id) {
        User user = userService.detail(id);
        if (user == null) {
            return MapControll.getInstance().nodata().getMap();
        }
        return MapControll.getInstance().success().put("data",user).getMap();
    }

服务层代码 :通过链式调用简化代码

    public User detail(Integer id) {
        return userDao.detail(MapParameter.getInstance().add("id", id).getMap());
    }

DAO层代码 

    public int creates(User user);

    public int  delete(Map<String, Object> map);

    public List<User> query(Map<String, Object> map);

    public int update(Map<String, Object> map);

    public int count(Map<String, Object> map);

    public User detail(Map<String, Object> map);

②简化控制层返回前端代码 

自定义前端链式调用类返回

package com.yanzhen.utils;

import java.util.HashMap;
import java.util.Map;

public class MapControll {

    private static final String success = "1000";
    private static final String error = "1001";
    private static final String nodate = "1002";

    private Map<String, Object> param = new HashMap<>();

    private MapControll() {

    }

    public static MapControll getInstance() {
        return new MapControll();
    }

    public MapControll addId(Object value ) {
        param.put("id", value);
        return this;
    }
    public MapControll add(String key, Object value) {
        param.put(key, value);
        return this;
    }
    public MapControll put(String key, Object value) {
        this.add(key, value);
        return this;
    }

    public MapControll put(Map<String, Object> map) {
        this.add(map);
        return this;
    }
    public MapControll add(Map<String, Object> map) {
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            param.put(entry.getKey(), entry.getValue());
        }
        return this;
    }


    //当成功的时候,让这个类的对象往自己的属性集合里面放一个成功
    public MapControll success() {
        param.put(success, "操作成功");
        return this;
    }

    public MapControll error() {
        param.put(error, "操作失败");
        return this;
    }

    public MapControll nodata() {
        param.put(nodate, "没有数据");
        return this;
    }

    public Map<String, Object> getMap() {
        return param;
    }


}

 前端控制层调用过程

    @PostMapping("/detail/{id}")
    @ResponseBody
    public Map<String,Object> detail(@PathVariable Integer id) {
        User user = userService.detail(id);
        if (user == null) {
            return MapControll.getInstance().nodata().getMap();
        }
        return MapControll.getInstance().success().put("data",user).getMap();
    }

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码敲上天.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值