当前位置: 首页 > wzjs >正文

c 网站开发案例源码新闻发布稿

c 网站开发案例源码,新闻发布稿,贵州icp网站备案中心,花都区网站建设Java函数式命令模式 轻量级跨包调用解耦方案,让跨包调用就像调用本地接口那样简单。适用与具有公共依赖的两个jar包,但是又不想相互引入对方作为依赖。 函数式命令模式,很好地实现了跨包调用解耦的目标,并且通过泛型JSON动态转换保…

Java函数式命令模式

        轻量级跨包调用解耦方案,让跨包调用就像调用本地接口那样简单。适用与具有公共依赖的两个jar包,但是又不想相互引入对方作为依赖。

        函数式命令模式,很好地实现了跨包调用解耦的目标,并且通过泛型+JSON动态转换保证了灵活性。

        设计决策:

特性

实现效果

优势

跨包调用

通过字符串Key调用,完全消除编译期依赖

模块完全隔离

类型安全

泛型+ Class<T> 确保参数类型正确

避免运行时类型错误

轻量简洁

无状态无复杂继承结构,直接函数式调用

比传统命令模式更简洁

JSON兼容

天然支持RPC/微服务改造(未来如需)

轻松改造成RPC调用

        常量命令:

public interface Command {
    String CMD_MENU_SAVE = "menu.save";
}

        命令操作系统:

public abstract class OperateSystem {
    private static final Map<String, Function<JSONObject, ?>> COMMAND_MAP = new HashMap<>();

    public static <T, R> void registerCommand(String command, Class<T> paramType, Function<T, R> receiver) {
        COMMAND_MAP.put(command, json -> {
            T param = json.toJavaObject(paramType);
            if (ObjectUtils.isEmpty(param)) {
                throw new CommonException("Parameter parsing failed, expected type: %s", paramType.getName());
            }

            String message = BeanUtils.parseEmptyField(param);
            if (StringUtils.isNotBlank(message)) {
                throw new CommonException("Parameter validation failed: %s", message);
            }

            return receiver.apply(param);
        });
    }


    public static void unregisterCommand(String command) {
        COMMAND_MAP.remove(command);
    }

    public static <R> R execute(String command, JSONObject param) {
        Function<JSONObject, R> function = getJsonFunction(command);
        return function.apply(param);
    }

    @SuppressWarnings("unchecked")
    private static <R> Function<JSONObject, R> getJsonFunction(String command) {
        Function<JSONObject, R> function = (Function<JSONObject, R>) COMMAND_MAP.get(command);
        if (ObjectUtils.isEmpty(function)) {
            throw new CommonException("Unregistered command: %s", command);
        }
        return function;
    }

    @SuppressWarnings("unchecked")
    public static <R, E> E execute(String command, Class<E> resultType, JSONObject param) {
        if (ObjectUtils.isEmpty(resultType)) {
            throw new CommonException("Command result type can not be null: %s", command);
        }

        Function<JSONObject, R> function = getJsonFunction(command);
        R result = function.apply(param);
        if (ObjectUtils.isEmpty(result)) {
            return null;
        }

        if (resultType.isInstance(result)) {
            return (E)result;
        }

        throw new CommonException("Command [%s] failed to produce the expected result." +
                " Expected type: %s, Actual type: %s", command,
                resultType.getName(), result.getClass().getName());
    }

}

        上述两个代码放在公共依赖包中,如common.jar。

        模块接收者(引入common.jar依赖):

@PostConstruct  // 依赖注入完成后初始化函数
private void registerCommand() {
    OperateSystem.registerCommand(Command.CMD_MENU_SAVE, SaveMenu.class, this::saveMenu);
}

public Boolean saveMenu(SaveMenu saveMenu) {
    ... ...
}

        模块调用者(引入common.jar依赖):

public void analyseBuildCache() {
    ... ...

    String rootPath = this.engineer.getInterfaceRootPath();
    JSONObject param = new JSONObject();
    param.put("title", rootPath);
    param.put("code", StringUtils.absoluteLowerUnderlineLetter(rootPath));
    param.put("routePath", rootPath);

    String webPackagePath = this.engineer.getWebPackagePath();
    param.put("componentPath", webPackagePath.substring(6));
    param.put("sort", 1);
    OperateSystem.execute(Command.CMD_MENU_SAVE, param);
}

        对比传统方法:

方案

当前实现

Spring依赖注入

RPC调用

跨包隔离

✅ 完全隔离

❌ 需暴露接口

✅ 隔离

类型安全

✅ 运行时校验

✅ 编译期检查

❌ 需额外契约

代码量

⭐ 极少

⭐⭐ 中等

⭐⭐⭐ 复杂

性能

⭐⭐⭐ 直接调用

⭐⭐⭐ 直接调用

⭐ 网络开销

适用场景

        推荐使用:

        ✅ 模块化架构中的跨包调用;

        ✅ 需要快速开发且避免依赖传染的场景;

        ✅ 未来可能改为微服务但不想提前引入复杂设计。

        不推荐使用:

        ❌ 需要编译期强类型检查(考虑接口下沉)。

        ❌ 需要支持事务/重试等复杂控制流(考虑Spring事务代理)。

        命令模式核心:

        "将请求封装为对象,从而使你可以参数化其他对象使用不同的请求"
                                                                                ----《设计模式:可复用面向对象软件的基础》

本文为作者(难拳)原创,转载请注明出处。

http://www.dtcms.com/wzjs/347150.html

相关文章:

  • 枣阳建设局网站首页seo短视频网页入口营销
  • WordPress微信小程序专业临沂seo建站
  • wordpress 朋友圈整站seo优化公司
  • 杭州家具网站建设方案网络营销主要有哪些特点
  • 网站建设php培训百度竞价排名案例分析
  • 网站制作常见问题实体店怎么推广引流
  • asp动态网站开发基础教程拉新推广怎么做
  • 加强二级网站建设 招生重庆seo小潘大神
  • 手机网站怎么dw做青岛seo网站管理
  • 淘宝网站代理怎么做百度统计app下载
  • 池州网站建设网站建设网络整合营销方案ppt
  • 网站建设公司 南京seo外包顾问
  • 找人做网站属于诈骗吗中国进入一级战备2023
  • wordpress 安卓主题下载失败海外seo是什么
  • 如何做网站店铺的模板线上职业技能培训平台
  • 广东品牌网站建设代写文案的软件
  • 网站中超链接怎么做淘宝指数查询入口
  • 古田路9号设计网站网站优化推广方法
  • 柳州市网站建设营销型网站建设的公司
  • 网站建设经验分享五年级下册数学优化设计答案
  • 企业网站建设的主要目的是舆情分析系统
  • 建设导航网站百度快速排名用是
  • 搬瓦工可以做网站吗自媒体培训学校
  • 网站构造下拉列表怎么做百度搜图入口
  • 沈阳网站建设公司的公司荆门网站seo
  • 莱芜在线电话seo专业学校
  • dedecms购物网站模板雷神代刷网站推广
  • wordpress 站长统计插件推广形式有哪几种
  • axure可以做网站百度广告多少钱
  • asp商品网站源码苏州首页排名关键词优化