为了账号安全,请及时绑定邮箱和手机立即绑定

使用相同参数的多个方法的设计模式

使用相同参数的多个方法的设计模式

BIG阳 2021-06-28 08:51:24
我有这个类,我有一个方法,将返回一个映射,在其中使用许多使用相同参数的方法。我的班级有数千行,而且还会增加。我可以创建多个类并在内部创建方法,但我问是否有针对此场景的特殊设计实际场景:public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {   Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);   lastMap = do1(firstMap, lastMap);   lastMap = do2(firstMap, lastMap);   lastMap = do3(firstMap, lastMap);   lastMap = do4(firstMap, lastMap);   //more 20 methods   return lastMap;}尝试不设计:public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {    Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);    Do1 do1 = new Do1();    lastMap = do1.do1(firstMap, lastMap);    Do2 do2 = new Do2();    lastMap = do2.do2(firstMap, lastMap);    // more 20 methods    return lastMap;}
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

如果do1等只是实现,而不是类的公共接口的一部分,那么创建一个私有类(甚至可能是嵌套类)可能是有意义的,它的构造函数接受它作为实例变量保留的两个映射:


private static class Worker {

    Worker(Map firstMap, Map secondMap) {

        this.firstMap = firstMap;

        this.secondMap = secondMap;

    }

    void do1() {

        // ...update `this.lastMap` if appropriate...

    }

    void do2() {

        // ...update `this.lastMap` if appropriate...

    }

}

我在那里做了Worker static一个静态嵌套类,而不是内部类,但static如果您需要访问周围类的内部结构,它可以是内部类(否)。


然后


public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {

     Worker worker = new Worker(firstMap, new HashMap<String, Object>(firstMap));

     worker.do1();

     worker.do2();

     worker.do3();

     worker.do4();

     //more 20 methods

     return worker.lastMap;

}


查看完整回答
反对 回复 2021-07-14
?
莫回无

TA贡献1865条经验 获得超7个赞

您可以使用interface并使每个“做”功能接口的实现。


interface Do {

    Map<String, Object> apply(Map<String, Object> firstMap, Map<String, Object> lastMap);

}

然后你可以初始化 static dos:


static Do[] allDos = {

    (firstMap, lastMap) -> {

        // do0

    },

    (firstMap, lastMap) -> {

        // do1

    },

    // ...do2, do3, ...

};

如果您需要调用do0 -> do2 -> do4例如:


public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {

    Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);

    int[] ids = { 0, 2, 4 };

    for (int id : ids)

        lastMap = allDos[id].apply(firstMap, lastMap);

    return lastMap;

}


查看完整回答
反对 回复 2021-07-14
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

为什么不采取更多的功能方法?


定义接口


interface MapTransformation{ 

     void transformation(Map<String, Object>  first, Map<String, Object>  last);

}

然后在类创建期间,具有定义的类transformMapOnAnotherMap将转换列表作为参数然后你可以做


class SomeClass {


    final private List<MapTransformation> transformations;


    //constructor omitted 


    public Map<String, Object> transformMapOnAnotherMap(Map<String, Object> firstMap) {


        Map<String, Object> lastMap = new HashMap<String, Object>(firstMap);

        transformations.forEach(t->t.transformation(firstMap,lastMap);

        return lastMap;


    }

}


查看完整回答
反对 回复 2021-07-14
  • 3 回答
  • 0 关注
  • 234 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信