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