设计模式实际工作实践——组合模式
阅读引导:
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_index | type | value |
---|---|---|
10010 | C | 100|120|130 |
2 目标形式
目标方案很明确,把value值拆分成纵表的形式,希望存储的value字段数据类型如下,达到无限扩展的方式:
biz_index | type | value |
---|---|---|
10010 | C | 100|120|130 |
10010 | C | 140 |
10010 | C | 150 |
10010 | C | 160 |
真实的业务数据远比这些简单的数字复杂,由于涉及非技术原因,存量数据很难迁移变形。(没有背景的情况下,我们不会简单直接的将value字段扩长,或者设置成clob大字段)
所以,我们只能改造程序,使得程序兼容存量的数据“100|120|130"与新增的单个value值的数据。
涉及到增删改查接口。
3 初级方案
实际上,这是一个典型的“组合模式”的应用。
我们可以看到老数据A:
biz_index | type | value |
---|---|---|
10010 | C | 100|120|130 |
与未来新增的数据B:
biz_index | type | value |
---|---|---|
10010 | C | 140 |
数据B的value值,是数据A的value值的一部分。
最“不动脑子”的方式,当然是在新增、修改、删除、查询等代码中,判断value值中有没有包含“|”,然后分别去处理,但是真正写出来代码之后,就会发现代码非常臃肿、难看,因为每一个处理数据的地方,都需要处理“|”。
实际上,“组合模式”早就给我们提供了优雅简练的解决方案。
4 组合模式应用
组合模式,使得对象与对象集合同等看待。
注意一点,设计模式语言中的“对象”、“接口”等字段,千万不要直接映射到Java等语言的语言结构上。
例如,不要认为组合模式中说的“对象”,就是Java中的Class。
实际上,这里的“对象”,是指程序处理的内容。
例如上面的例子,就是 value这个字段。
那么我们考虑,怎么处理value使得两种模式得到同样的处理?
很简单:
String[] values = value.split("\\|")
这样,老数据value值拆分成一个String数组,而新数据是只有一个值的数据。
然后,就可以对两种数据统一处理了。
具体代码不再赘述。
5 概念迁移
很奇怪的一点,再给组内的开发人员,这种情况适用组合模式之后,他还是没有去应用。
问及原因,答复说上网搜索一下之后,很多例子都是 文件 与 文件夹 这种例子,不明白这里怎么应用。
网络上的例子,一般是“极其”明显的简单例子。
但是实际工作中,遇到的问题就不会这么明显了,需要经过分析之后才能应用。
所以,在看到一个设计模式的“概念”之后,一定不要死记硬背,不要限制了对“概念”的理解,要了解这个设计模式解决的“模式”。