设计模式实际工作实践——组合模式

本文通过一个实际工作中遇到的白名单控制表问题,介绍了如何运用设计模式中的组合模式来解决字段超长问题。文章阐述了从存量系统问题出发,到目标形式的确定,再到初步解决方案和组合模式的实际应用,最后讨论了概念迁移的重要性,强调理解设计模式的本质而非局限于表面示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式实际工作实践——组合模式

阅读引导

1、"对象"与”对象组合“一视同仁的思想。横表扩展成纵表的技术方案。

2、设计模式,程序开发中经过千锤百炼的”招式套路“,解决工作中的真实问题。

3、为自己工作,为自己的系统工作,做自己的老板,形成正循环:打磨当前工作的核心关键能力——>高效能工作——>更多时间打磨自己的系统——>更高效能工作——>打磨下个层次工作的核心关键能力……

4、核心竞争力,是指你拥有的(独特的)知识经验组合,经过你思维逻辑的组织梳理,在实践中产生无可替代的价值。打造自己的TMS系统(T:专业技术;M:沟通管理、S:行业解决方案),利用复利效应,让系统为自己工作。

一个典型的应用是遍历文件夹、文件之间的处理,文件夹与文件是典型的组合关系。

不过,很多实际工作中,没有这么明显的组合关系,需要进行分析之后再去应用。

下面举一个例子。

1 存量系统问题

工作中遇到一个问题:

存量系统中,有一个白名单控制表【为了方便表简称:white_list,里面有两个字段:biz_index(业务唯一索引)、type(白名单类型,例如C表示customer客户号,O表示org机构编号……)、value(存储的A|B|C这种大字段)字段长度定义为了2000】。

随着业务的发展,value字段的长度已经达到了1600,很快就要超长。

biz_indextypevalue
10010C100|120|130

2 目标形式

目标方案很明确,把value值拆分成纵表的形式,希望存储的value字段数据类型如下,达到无限扩展的方式:

biz_indextypevalue
10010C100|120|130
10010C140
10010C150
10010C160

真实的业务数据远比这些简单的数字复杂,由于涉及非技术原因,存量数据很难迁移变形。(没有背景的情况下,我们不会简单直接的将value字段扩长,或者设置成clob大字段)

所以,我们只能改造程序,使得程序兼容存量的数据“100|120|130"与新增的单个value值的数据。

涉及到增删改查接口。

3 初级方案

实际上,这是一个典型的“组合模式”的应用。

我们可以看到老数据A:

biz_indextypevalue
10010C100|120|130

与未来新增的数据B:

biz_indextypevalue
10010C140

数据B的value值,是数据A的value值的一部分。

最“不动脑子”的方式,当然是在新增、修改、删除、查询等代码中,判断value值中有没有包含“|”,然后分别去处理,但是真正写出来代码之后,就会发现代码非常臃肿、难看,因为每一个处理数据的地方,都需要处理“|”。

实际上,“组合模式”早就给我们提供了优雅简练的解决方案。

4 组合模式应用

组合模式,使得对象与对象集合同等看待。

注意一点,设计模式语言中的“对象”、“接口”等字段,千万不要直接映射到Java等语言的语言结构上。

例如,不要认为组合模式中说的“对象”,就是Java中的Class。

实际上,这里的“对象”,是指程序处理的内容。

例如上面的例子,就是 value这个字段。

那么我们考虑,怎么处理value使得两种模式得到同样的处理?

很简单:

String[] values = value.split("\\|")

这样,老数据value值拆分成一个String数组,而新数据是只有一个值的数据。

然后,就可以对两种数据统一处理了。

具体代码不再赘述。

5 概念迁移

很奇怪的一点,再给组内的开发人员,这种情况适用组合模式之后,他还是没有去应用。

问及原因,答复说上网搜索一下之后,很多例子都是 文件 与 文件夹 这种例子,不明白这里怎么应用。

网络上的例子,一般是“极其”明显的简单例子。

但是实际工作中,遇到的问题就不会这么明显了,需要经过分析之后才能应用。

所以,在看到一个设计模式的“概念”之后,一定不要死记硬背,不要限制了对“概念”的理解,要了解这个设计模式解决的“模式”。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值