代码之家  ›  专栏  ›  技术社区  ›  abdel

在Java/Kotlin中以不同的顺序和频率处理类中调用共享子方法的方法

  •  0
  • abdel  · 技术社区  · 1 年前

    我如何在Java/Kotlin类中实现多个方法,这些方法调用相同的子方法,但顺序不同,或者有时一个方法调用的子方法比另一个多?这个场景有设计模式吗?

                      +------------------+
                      |   My Class       |
                      +------------------+
                               |
                +--------------+--------------+
                |                             |
     +------------------+         +------------------+
     | Method A         |         | Method B         |
     +------------------+         +------------------+
     | Call SubMethod 1 |         | Call SubMethod 2 |
     | Call SubMethod 2 |         | Call SubMethod 1 |
     | ...              |         | ...              |
     +------------------+         +------------------+
                    
    
      +------------------+         +------------------+
      | SubMethod 1      |         | SubMethod 2      |
      +------------------+         +------------------+
      | Implementation   |         | Implementation   |
      | ...              |         | ...              |
      +------------------+         +------------------+
    

    我有很多方法要在同一个类上实现。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Mureinik    1 年前

    如果只有几个方法,我不会想太多,只需要硬编码调用:

    public class MyClass {
        public void subMethod1() {/* ... */}
        public void subMethod2() {/* ... */}
       
        public void methodA() {
            subMethod1();
            subMethod2();
        }
    
        public void methodB() {
            subMethod2();
            subMethod1();
        }
    }
    

    或者,换句话说,不要在不需要的地方过度设计。

        2
  •  0
  •   StepUp    1 年前

    我不熟悉Java,也没有Java IDE,但我想分享一下如何按照您想要的顺序运行方法。

    以下代码使用C#,我找到了一个链接 imitate delegates in Java 。基本上,您需要的只是一个数组,您可以在其中按所需顺序添加对方法的引用。

    所以完整的代码看起来像这样。

    public class MyClass
    {
        public void RunInYourOrder(IEnumerable<Action> someMethodsInYourDesiredOrder) 
        {
            foreach (var method in someMethodsInYourDesiredOrder)
            {
                method?.Invoke();
            }
        }
    
        public void Method1() 
        {
            Console.WriteLine("Method 1 is called");
        }
    
        public void Method2()
        {
            Console.WriteLine("Method 2 is called");
        }
    }
    

    要运行的代码如下:

    MyClass myClass= new MyClass();
    List<Action> methodsToBeRun = new List<Action>()
    { 
        () => myClass.Method2(),
        () => myClass.Method1(),
    };
    myClass.RunInYourOrder(methodsToBeRun);
    

    输出:

    Method 2 is called
    Method 1 is called
    
        3
  •  0
  •   Sagar    1 年前

    您可以将步骤定义为可以直接引用的Consumers,并在该方法的consumer中定义顺序。

    class Scratch {
    
        private static final Consumer<TaskDoer> task5 = buildable1 -> buildable1.task5(5);
        private static final Consumer<TaskDoer> task1 = buildable1 -> buildable1.task1();
        private static final Consumer<TaskDoer> task2 = buildable1 -> buildable1.task2();
        private static final Consumer<TaskDoer> task3 = buildable1 -> buildable1.task3();
    
        public static void main(String[] args) {
            TaskOrganizer organizer = new TaskOrganizer();
            TaskDoer doer = new TaskDoer();//your class
    
            organizer.addSteps(task1,task3,task1,task5,task2);
            organizer.build(doer);
            System.out.println(doer.outResult);
        }
    }
    class TaskOrganizer {
        
        TaskDoer taskDoer;
        
        List<Consumer<TaskDoer>> orderOfSteps = new ArrayList<Consumer<TaskDoer>>();
    
        public void addStep(Consumer<TaskDoer> task){
            orderOfSteps.add(task);
        }
    
        public void addSteps(Consumer<TaskDoer> ... steps){
            for (int i = 0; i < steps.length; i++) {
                orderOfSteps.add(steps[i]);
            }
        }
    
    
        public void build(TaskDoer buildable) {
            for (Consumer<TaskDoer> r:orderOfSteps) {
                r.accept(buildable);
            }
        }
    }
    class TaskDoer {
        String outResult="";
        
        public void task1(){
            outResult = outResult+" task1";
        }
        public void task2(){
            outResult = outResult+" task2";
        }
        public void task3(){
            outResult = outResult+" task3";
        }
        public void task4(){
            outResult = outResult+" task4";
        }
    
        public void task5(int i) {
            outResult = outResult+" task5";
        }
    }