Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个按钮,1个ClickListener使用泛型,策略模式-所有按钮只执行相同的操作_Java_Android_Generics_Listener_Strategy Pattern - Fatal编程技术网

Java 多个按钮,1个ClickListener使用泛型,策略模式-所有按钮只执行相同的操作

Java 多个按钮,1个ClickListener使用泛型,策略模式-所有按钮只执行相同的操作,java,android,generics,listener,strategy-pattern,Java,Android,Generics,Listener,Strategy Pattern,我一直在寻找在安卓系统中制作听众的不同方法。我将侦听器封装在一个名为Click的单独类中。我还使用了strategy模式来封装逻辑,它与enum类型的BinaryOperator接口。我有一个简单的计算器,你可能已经在网上看到了-2个输入数字,1个结果,4个按钮+,-,*,和/ 我的代码中有一个错误,因为无论我按下哪个按钮,它都只执行除法运算。我添加了泛型,这个问题可能就是由此产生的 顺便说一下,我正在尝试不同的方法来创建听众。我不是在寻找最好的方法,或者标准的方法,我在寻找学习不同的东西,所以

我一直在寻找在安卓系统中制作听众的不同方法。我将侦听器封装在一个名为Click的单独类中。我还使用了strategy模式来封装逻辑,它与enum类型的BinaryOperator接口。我有一个简单的计算器,你可能已经在网上看到了-2个输入数字,1个结果,4个按钮+,-,*,和/

我的代码中有一个错误,因为无论我按下哪个按钮,它都只执行除法运算。我添加了泛型,这个问题可能就是由此产生的

顺便说一下,我正在尝试不同的方法来创建听众。我不是在寻找最好的方法,或者标准的方法,我在寻找学习不同的东西,所以不要攻击我用来创建听众的方法

MainActivity.java Operation.java IOperationStrategy.java Add.java是4个
至于代码本身——甚至尝试你正在做的奇怪的事情,它的实现都大错特错。您不会在Click构造函数中同时使用一个对象和泛型,而是使用其中一个。这里泛型没有增加任何价值,因为您在任何地方都没有使用泛型类型——您只需要获取一个基类型的对象。如果您不了解继承和泛型,甚至不要开始尝试这样的代码-您将破坏您的学习曲线,而不是帮助它。在你有几年的设计经验之前,模式不应该是你所要处理的事情。在这种情况下,绝对不需要或使用泛型。您可以用操作操作替换T操作;所有操作都使用相同的策略,在本例中,最后一个名为new divideThank@njzk2的操作有效,这是因为静态。我将不得不分析我以前的迭代,看看以前没有出现过什么问题,并了解Java和其他编程相关的东西;将我的学习曲线扩展到其他方向。我将研究修改泛型的使用。我已经经历了几次迭代,其中一次将我带向了这个方向,但它是有缺陷的。我从头开始,认为它仍然可以工作-没有意识到我不需要泛型
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button btnAdd = (Button) findViewById(R.id.btnAddition);
    Button btnSub = (Button) findViewById(R.id.btnSubtract);
    Button btnMul = (Button) findViewById(R.id.btnMultiple);
    Button btnDiv = (Button) findViewById(R.id.btnDivide);

    txtNumber1 = (EditText) findViewById(R.id.txtNumber1);
    txtNumber2 = (EditText) findViewById(R.id.txtNumber2);
    txtResult = (EditText) findViewById(R.id.txtResult);

    btnAdd.setOnClickListener(new Click<>(Add.OPERATION).listenerOn(this));
    btnSub.setOnClickListener(new Click<>(Subtract.OPERATION).listenerOn(this));
    btnDiv.setOnClickListener(new Click<>(Divide.OPERATION).listenerOn(this));
    btnMul.setOnClickListener(new Click<>(Multiply.OPERATION).listenerOn(this));

}
public class Click<T extends Operation> {

    private T operation;

    private View.OnClickListener listener;

    public Click(T operation) {

        this.operation = operation;

    }

    public View.OnClickListener listenerOn(final MainActivity UI) {

        if (listener != null) return listener;

        listener = new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                double total, num1, num2;

                num1 = Double.parseDouble(UI.txtNumber1.getText().toString());
                num2 = Double.parseDouble(UI.txtNumber2.getText().toString());

                total = operation.execute(num1, num2);

                UI.txtResult.setText(Double.toString(total) + " -v5");

            }
        };

        return listener;

    }

}
public enum BinaryOperation {

    Add (new Operation(new Add())),
    Subtract (new Operation(new Subtract())),
    Multiply (new Operation(new Multiple())),
    Divide (new Operation(new Divide()));

    public final Operation OPERATION;

    private BinaryOperation(Operation operation) {

        OPERATION = operation;

    }

}
public class  Operation {

    private static IOperationStrategy strategy;

    public Operation(IOperationStrategy strategy) { this.strategy = strategy; }

    public double execute(double a, double b) { return strategy.executeOperation(a, b); }

}
public interface IOperationStrategy {

    public double executeOperation(double a, double b);

}
public class Add implements IOperationStrategy {

    @Override
    public double executeOperation(double a, double b) {

        return a + b;

    }
}