用于委托其参数的构造函数

时间:2015-03-06 10:05:16

标签: java

嗨,我无法以更好的方式重构我的代码,并且想在这里询问SO以获得一些帮助。

所以,我有一个构造函数,它接受4个不同的接口。

public Manager(FooSqlInterface foo, BarSqlInterface bar, MooSqlInterface moo, ZaaSqlInterface zaa)
    {
        this.foo = foo;
        this.bar = bar;
        this.moo = moo;
        this.zaa = zaa;
    }

但是,当我使用我的管理器时,我总是需要发送4个不同的接口,但我每次只使用一个接口。

我仍然希望使用我的经理,但只是委托构造函数接受的参数并将其传递给使用它的实际类。

有没有更好的方法只在构造函数中接受1个接口,并且根据它是哪个接口,它将返回该类的实例。

像这样的东西

public Manager(T type)
{
    this.type = type;
    execute();
}

public T execute()
{
    if(type instanceof FooSqlInterface)
    {
        return Foo();
    }
}

我试过这样的代码,但我无法让它工作。它只会提供未经检查的类型错误。

提前致谢!

2 个答案:

答案 0 :(得分:3)

如果可能,您可以尝试使用超级界面吗?我试图做一个简单的例子。

主要

 public static void main(String[] args) throws ParseException {

    A a = new AImpl();
    B b = new BImpl();
    C c = new CImpl();

    Manager m1 = new Manager(a);
    Manager m2 = new Manager(b);
    Manager m3 = new Manager(c);

    m1.doSomething();
    m2.doSomething();
    m3.doSomething();

}

超级界面

public interface Alphabetic {

    void execute();
}

<强>接口

public interface A extends Alphabetic {

    void execute();
}

public interface B extends Alphabetic {

    void execute();
}

public interface C extends Alphabetic {

    void execute();
}

<强>实现

 public class AImpl implements A {

    /* (non-Javadoc)
     * @see tester.A#execute()
     */
    @Override
    public void execute() {
        System.out.println("I am A");
    }

}

public class BImpl implements B {

    /* (non-Javadoc)
     * @see tester.A#execute()
     */
    @Override
    public void execute() {
        System.out.println("I am B");
    }

}

public class CImpl implements C {

    /* (non-Javadoc)
     * @see tester.A#execute()
     */
    @Override
    public void execute() {
        System.out.println("I am C");
    }

}

<强>输出

I am A

I am B

I am C

答案 1 :(得分:0)

以下是我使用编码进行实验的内容。 使用超级界面以及工厂模式。

/ *  *要更改此许可证标题,请在“项目属性”中选择“许可证标题”。  *要更改此模板文件,请选择“工具”|模板  *并在编辑器中打开模板。  * / 包装实验;

/ **  *  * @author WMads2429175  * /

public class Experiment {

    public Experiment() {


        X returnObject;
        Manager m = new Manager(new FooY());
        returnObject=m.execute();
        returnObject.check();

        m = new Manager(new FooZ());
        returnObject=m.execute();
        returnObject.check();

    }

    public static void main(String[] args) {

        new Experiment();
    }

    class Manager {

        X type;

        public Manager(X type) {

            this.type = type;

        }

        public X execute() {

            if (type instanceof  Y) {

                System.out.println("mark 1");

                return new FooY();
            } else if (type instanceof Z) {

                 System.out.println("mark 2");
                return new FooZ();
            }

            return new FooY();

        }
    }

    interface X {

        public void check();
    }

    interface Y extends X {

    }

    interface Z extends X {

    }

    class FooY implements Y {

        public void check() {
            System.out.println("I am Y");
        }
    }

    class FooZ implements Z {

        public void check() {
            System.out.println("I am Z");
        }
    }

}