V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
li24361
V2EX  ›  程序员

如何设计 java 的上下文传递

  •  
  •   li24361 · 2015-12-18 22:42:52 +08:00 · 2822 次点击
    这是一个创建于 3262 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有段业务重构

    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 ,如果声明为
    全局变量,感觉也不好,所以想看看
    大家有什么好主意

    8 条回复    2015-12-19 15:48:29 +08:00
    loshine1992
        1
    loshine1992  
       2015-12-18 22:55:03 +08:00
    模板方法模式?
    li24361
        2
    li24361  
    OP
       2015-12-18 23:05:50 +08:00
    @loshine1992 谢谢
    li24361
        3
    li24361  
    OP
       2015-12-18 23:17:44 +08:00
    @loshine1992 现在用的就是模板模式了,不过就是方法间传值太恶心了,没办法就只能每个方法查询一次了
    hepin1989
        4
    hepin1989  
       2015-12-18 23:22:04 +08:00
    放入一个 Context 对象中,或者 threadlocal 。看你是用的什么模型了。
    zonghua
        5
    zonghua  
       2015-12-19 00:25:00 +08:00 via iPhone
    request ?
    li24361
        6
    li24361  
    OP
       2015-12-19 08:14:30 +08:00 via iPhone
    @hepin1989 直接把用到的都作为属性,还是定制一个 map
    palmers
        7
    palmers  
       2015-12-19 10:06:51 +08:00
    如果你的所有订单类型入参一致,可以直接使用代理模式 , 如果表面上看不一样,可以想办法让入参尽可能的一致(比如使用抽象类描述等)然后将这个订单处理抽象成一个接口, 不同的订单类型实现该接口就可以了
    decaywood
        8
    decaywood  
       2015-12-19 15:48:29 +08:00
    参数如果只是只读的话只需要封装在一个对象里面即可,如果需要写,最好就重新查一次,同步的坑可不浅
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   953 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:24 · PVG 04:24 · LAX 12:24 · JFK 15:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.