【设计模式】【第二章】【业务投放场景】【责任链模式】

简介: 【设计模式】【第二章】【业务投放场景】【责任链模式】

文章目录


创建design-demo项目

需求分析

创建UserController

创建AbstractSuggestRequirementHandler

创建CityCheckHandler

创建NewCheckHandler

创建PersonnalCheckHandler

创建RecentCheckHandler

创建SuggestRequirementHandlerProcess

创建UserInfo

创建UserService

创建UserServiceImpl

修改application.properties

接口调用测试是否正常工作

接口调用逻辑讲解


创建design-demo项目


项目代码:https://gitee.com/java_wxid/java_wxid/tree/master/demo/design-demo

项目结构如下(示例):


6d2f06502e6c4e789cf78e70b3ab8384.png


需求分析


e91d2b600d1e491b9345a405ccc2893c.png


责任链模式核心功能:允许规则实时增减和顺序调整。

如果按照传统模式开发,这里难以满足上述规则实时增减和顺序调整,其次过滤规则有可能根据产品需求灵活变动,一旦发生变动就会对业务层代码进行修改,从而可能影响之前开发好的业务逻辑。


创建UserController


代码如下(示例):


package com.example.designdemo.controller;
import com.example.designdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/25 19:26
 * @Description:
 */
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/suggest")
    public List<String> suggestRequirement(@RequestParam String username) {
        return userService.suggestRequirement(username);
    }
}


创建AbstractSuggestRequirementHandler


代码如下(示例):


package com.example.designdemo.handler;
import com.example.designdemo.pojo.UserInfo;
import java.util.List;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/25 19:26
 * @Description:
 */
public abstract class AbstractSuggestRequirementHandler {
    abstract void processHandler(UserInfo userInfo, List<String> suggestLists);
}


创建CityCheckHandler


代码如下(示例):


package com.example.designdemo.handler;
import com.example.designdemo.pojo.UserInfo;
import java.util.List;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/25 19:26
 * @Description:用户所在城市是否满足业务投放城市
 */
public class CityCheckHandler extends AbstractSuggestRequirementHandler{
    @Override
    public void processHandler(UserInfo userInfo, List<String> suggestLists) {
        //通过获取 userinfo 的 city 属性
        String city = userInfo.getCity();
        // 通过city 和 之前保留的 4 个 业务信息进行对比。然后筛选出剩余的 3 个 业务投放
        suggestLists.remove("1");
    }
}


创建NewCheckHandler


代码如下(示例):


package com.example.designdemo.handler;
import com.example.designdemo.pojo.UserInfo;
import java.util.ArrayList;
import java.util.List;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/25 19:26
 * @Description:新用户首次购买投放指定业务
 */
public class NewCheckHandler extends AbstractSuggestRequirementHandler{
    @Override
    public void processHandler(UserInfo userInfo, List<String> suggestLists) {
        //通过获取 userinfo 的 buyProducts 属性
        boolean newUser = userInfo.isNewUser();
        if(newUser) {
            suggestLists = new ArrayList<>(); // 特定的新用户奖励
        }
    }
}


创建PersonnalCheckHandler


代码如下(示例):


package com.example.designdemo.handler;
import com.example.designdemo.pojo.UserInfo;
import java.util.List;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/25 19:26
 * @Description:用户资质是否满足业务投放资质
 */
public class PersonnalCheckHandler extends AbstractSuggestRequirementHandler{
    @Override
    public void processHandler(UserInfo userInfo, List<String> suggestLists) {
        // 通过个人资质的check,我们找到了 4 个可以投放的业务。放到 suggestLists 中。
        suggestLists.add("1");
        suggestLists.add("2");
        suggestLists.add("3");
        suggestLists.add("4");
    }
}


创建RecentCheckHandler


代码如下(示例):


package com.example.designdemo.handler;
import com.example.designdemo.pojo.UserInfo;
import java.util.List;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/25 19:26
 * @Description:用户近期购买的商品是否符合投放的人群
 */
public class RecentCheckHandler extends AbstractSuggestRequirementHandler{
    @Override
    public void processHandler(UserInfo userInfo, List<String> suggestLists) {
        //通过获取 userinfo 的 buyProducts 属性
        List<String> buyProducts = userInfo.getBuyProducts();
        // buyProducts 和 之前保留的 3 个 业务信息进行对比。然后筛选出剩余的 2 个 业务投放
        suggestLists.remove("2");
    }
}


创建SuggestRequirementHandlerProcess


代码如下(示例):


package com.example.designdemo.handler;
import com.example.designdemo.pojo.UserInfo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/25 19:26
 * @Description:
 */
@Component
public class SuggestRequirementHandlerProcess {
    @Value("#{'${suggest.requirement.handler}'.split(',')}")
    private List<String> handlers;
    public void process(UserInfo userInfo, List<String> suggestLists) {
        // 如果想要实时的进行顺序的调整或者是增减。那必须要使用配置中心进行配置。比如springcloud里边自带的 git 的这种配置中心; applo 配置中心;nacos配置中心。
        try {
            for(String handler : handlers) {
                AbstractSuggestRequirementHandler handle =
                        (AbstractSuggestRequirementHandler) Class.forName(handler).newInstance();
                handle.processHandler(userInfo, suggestLists);
            }
        } catch (Exception e) {
        }
    }
}


创建UserInfo


代码如下(示例):


package com.example.designdemo.pojo;
import java.util.List;
public class UserInfo {
    private String username;
    private String city;
    private List<String> buyProducts;
    private boolean isNewUser;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public List<String> getBuyProducts() {
        return buyProducts;
    }
    public void setBuyProducts(List<String> buyProducts) {
        this.buyProducts = buyProducts;
    }
    public boolean isNewUser() {
        return isNewUser;
    }
    public void setNewUser(boolean newUser) {
        isNewUser = newUser;
    }
}


创建UserService


代码如下(示例):


package com.example.designdemo.service;
import java.util.List;
/**
 * @Author: zhiwei Liao
 * @Date: 2022/9/25 9:28
 * @Description:
 */
public interface UserService {
    List<String> suggestRequirement(String username);
}


创建UserServiceImpl


代码如下(示例):


package com.example.designdemo.service.impl;
import com.example.designdemo.handler.SuggestRequirementHandlerProcess;
import com.example.designdemo.pojo.UserInfo;
import com.example.designdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private SuggestRequirementHandlerProcess suggestRequirementHandlerProcess;
    @Override
    public List<String> suggestRequirement(String username) {
        //获取用户信息。因为用户已经登录了,那么user的信息是保存在我们的缓存里的。
        UserInfo userInfo = getUserInfo(username);
        List<String> results = new ArrayList<>();
        //可以发现,调用方无需关心任何 handler。完全对其屏蔽的。而且是完全解耦
        suggestRequirementHandlerProcess.process(userInfo, results);
        return results;
    }
    //因为这部分是需要查询 缓存(如果缓存没有,需要查库)不应该写到 service层,但是为了代码书写简便
    //这部分我模拟在service 层。
    private UserInfo getUserInfo(String username) {
        return new UserInfo();
    }
}


修改application.properties


代码如下(示例):


# 应用名称
spring.application.name=design-demo
# 这里比喻成配置中心 先后顺序决定投放执行的逻辑
# 这里我们先执行PersonnalCheckHandler用户资质是否满足业务投放资质,为用户添加投放业务1,2,3,4.
# 然后再执行CityCheckHandler用户所在城市是否满足业务投放城市,移除用户投放业务1.
# 接着执行RecentCheckHandler用户近期购买的商品是否符合投放的人群,移除用户投放业务2。
# 最后执行NewCheckHandler新用户首次购买投放指定业务,给业务特定业务奖励。最终给用户投放业务3,4
suggest.requirement.handler=com.example.designdemo.handler.PersonnalCheckHandler,com.example.designdemo.handler.CityCheckHandler,com.example.designdemo.handler.RecentCheckHandler,com.example.designdemo.handler.NewCheckHandler


接口调用测试是否正常工作


如下图(示例):


a51ec59126f34b0a8150d845e3a4195a.png


接口调用逻辑讲解


请求进来


如下图(示例):


a9afe40529c64c1f98cbb3cb9a5a3bdf.png


d60da4156ad54ba5aa86ae15f2412a1b.png


247c921dbbb047aa81ac5f5846bd9d2f.png


37dbed717bfb4003bddc10d1cce64ab2.png


6a330cea761d4795ac505a95a230ef56.png


3cdfde5bbc4b41e69722a4cfe6040472.png


8d6c259bb53b4dd3808176e598343692.png

相关文章
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
1月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
42 3
|
6月前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
72 4
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
58 9
|
25天前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
25 0
|
5月前
|
设计模式 Java
Java中的设计模式及其应用场景解析
Java中的设计模式及其应用场景解析
|
1月前
|
设计模式 JavaScript Scala
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
Kotlin教程笔记(55) - 改良设计模式 - 责任链模式
39 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
本教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速上手Kotlin的读者,推荐查阅“简洁”系列教程。本文通过学生会经费申请的例子,介绍了责任链模式及其在Kotlin中的实现,并使用偏函数进行了改进,使代码更加简洁和灵活。
18 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin - 改良设计模式 - 责任链模式
Kotlin - 改良设计模式 - 责任链模式
42 0
|
2月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
45 0