如何设计 java 的上下文传递

2015-12-18 22:42:52 +08:00
 li24361

有段业务重构

void function (){
    A a=method1(int id);
    method2(B b,C c);  
    method3(D d,C c);
}

就是一个功能模块,原来是一个大方法
从头处理到尾,中间仅仅有几处小不同,类似于
处理一个订单,只有付款接口的参数是不同的
最后处理方式有些增加了额外的处理,
原来都是用 if else 判断订单类型,这样每次都要改代码
所以现在准备分拆成几个小方法,如上,
这样每次只要重新实现一个类,覆盖掉某个方法就可以了
但是现在遇到一个问题,就是传递参数的问题,原来一个
大方法,可以从头用到尾,现在,需要在 method1 用到的 A 、 B , C
然后 method2 中间又要去查询一次,影响效率,否则就要原封不动的放到参数里面
这样感觉很麻烦,不知道有没有合适的方法或者设计模式
能够让实现的轻松点,原来的实现方式是声明一个大 map ,然后全部放到 map 里面
每次就只传一个 map ,感觉不够明确,而且容易取值的时候写错 key ,如果声明为
全局变量,感觉也不好,所以想看看
大家有什么好主意

2760 次点击
所在节点    程序员
8 条回复
loshine1992
2015-12-18 22:55:03 +08:00
模板方法模式?
li24361
2015-12-18 23:05:50 +08:00
@loshine1992 谢谢
li24361
2015-12-18 23:17:44 +08:00
@loshine1992 现在用的就是模板模式了,不过就是方法间传值太恶心了,没办法就只能每个方法查询一次了
hepin1989
2015-12-18 23:22:04 +08:00
放入一个 Context 对象中,或者 threadlocal 。看你是用的什么模型了。
zonghua
2015-12-19 00:25:00 +08:00
request ?
li24361
2015-12-19 08:14:30 +08:00
@hepin1989 直接把用到的都作为属性,还是定制一个 map
palmers
2015-12-19 10:06:51 +08:00
如果你的所有订单类型入参一致,可以直接使用代理模式 , 如果表面上看不一样,可以想办法让入参尽可能的一致(比如使用抽象类描述等)然后将这个订单处理抽象成一个接口, 不同的订单类型实现该接口就可以了
decaywood
2015-12-19 15:48:29 +08:00
参数如果只是只读的话只需要封装在一个对象里面即可,如果需要写,最好就重新查一次,同步的坑可不浅

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/244565

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX