如何按OOP中的参数顺序调用方法?

时间:2017-04-06 15:31:02

标签: java design-patterns

假设我有四个类A,B,C和容器

我有以下对象以及如何通过仅向容器类添加代码来实现以下输出?

“con”对象的第一次调用应该对应于第一个参数。

非常感谢您的回答!

A  a = new A();    
B  b = new B();    
C  c = new C();

Container  con = new Container(a,b,c);

con.calling();
con.calling();
con.calling();

预期输出为:

calling from A
calling from B
calling from C
public class A {    
    public void callA() {
        System.out.println("calling from A");
    }
}

public class B {        
    public void callB() {
        System.out.println("calling from B");
    }
}

public class C {
    public void callC() {
        System.out.println("calling from C");
    }
}

public class Container {        

    public Container(A a, B b, C c) {

    }

    public void calling(){

    }    
}

2 个答案:

答案 0 :(得分:4)

看起来与Iterator模式/接口非常相似。这里不是calling()方法,而是next()

我可以为你画草图,例如:

import java.util.Arrays;
import java.util.Iterator;

public class Container implements Iterator {

    private Iterator<?> iter;

    public Container(Object ...values) {
        this.iter = Arrays.asList(values).iterator();
    }

    @Override
    public boolean hasNext() {
        return iter.hasNext();
    }

    @Override
    public Object next() {
        return iter.next();
    }
}

更新经过仔细审核后,我决定扩大答案。一般来说,Iterator以上的决定只能给你一个粗略的想法。您可能需要更具体的决策,这里使用java-8方法引用:

1)包含Runnable个实例的容器:

import java.util.Arrays;
import java.util.Iterator;

public class Container implements Iterator {

    private Iterator<Runnable> iter;

    public Container(Runnable ...values) {
        this.iter = Arrays.asList(values).iterator();
    }

    @Override
    public boolean hasNext() {
        return iter.hasNext();
    }

    @Override
    public Object next() {
        Runnable next = iter.next();
        next.run();
        return next;
    }
}

示例代码来测试这些东西:

Container container = new Container(new A()::callA, new B()::callB, new C()::callC);

container.next();
container.next();
container.next();

在这种情况下,它不仅会返回你的下一个实例,还会调用所需的方法。

答案 1 :(得分:1)

我会添加一个变量来考虑执行调用方法的时间,这可能是Container类:

class Container {

    int times = 0;

    A objectA;
    B objectB;
    C objectC;


    public Container(A a, B b, C c) {
        this.objectA = a;
        this.objectB = b;
        this.objectC = c;
    }

    public void Calling(){
        if(this.times==0){
            a.callA();
        }
        if(this.times==1){
            b.callB();
        }
        if(this.times==2){
            c.callC();
        }
        this.times++;
    }
}