package com.app;
import java.awt.BorderLayout;
import static java.awt.BorderLayout.NORTH;
import java.awt.FlowLayout;
import static java.awt.FlowLayout.CENTER;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class CalculatorApp extends JFrame {
String _operation = null;
Queue<String> queue = new LinkedList();
public CalculatorApp() {
SwingUtilities.invokeLater(() -> {
createAndShowGUI();
});
}
private void createAndShowGUI() {
JTextField field = new JTextField();
JPanel panel = new JPanel();
JButton[] buttons = new JButton[10];
panel.setLayout(new FlowLayout(CENTER,4,4));
String[] operations = {"+", "-", "*", "/", "=", "c"};
JButton[] _buttons = new JButton[operations.length];
for (int i = 0; i < 10; i++) {
int n = i;
panel.add(buttons[i] = new JButton(i + ""));
buttons[i].addActionListener((e) -> {
if("=".equals(_operation)){
field.setText("");
_operation=null;
}
field.setText(field.getText() + n);
});
}
for (int i = 0; i < operations.length; i++) {
String operation = operations[i];
panel.add(_buttons[i] = new JButton(operations[i]));
_buttons[i].addActionListener((e) -> {
if ("=".equals(operation)) {
Context context = null;
switch (_operation) {
case "+":
context = new Context(new OperationAdd());
break;
case "-":
context = new Context(new OperationSubtract());
break;
case "*":
context = new Context(new OperationMultiply());
break;
case "/":
context = new Context(new OperationDivide());
break;
}
_operation="=";
field.setText(context.executeStrategy(queue.peek(), field.getText()));
queue.clear();
} else if ("c".equals(operation)) {
field.setText("");
} else {
queue.add(field.getText());
_operation = operation;
field.setText("");
}
});
}
add(field, NORTH);
add(panel);
setResizable(false);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new CalculatorApp();
}
}
package com.app;
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public String executeStrategy(String num1, String num2){
return strategy.doOperation(num1, num2);
}
}
package com.app;
public class OperationAdd implements Strategy{
@Override
public String doOperation(String num1, String num2) {
return Integer.parseInt(num1) + Integer.parseInt(num2)+"";
}
}
package com.app;
public class OperationDivide implements Strategy{
@Override
public String doOperation(String num1, String num2) {
if("0".equals(num2)){
return null;
}
return Integer.parseInt(num1) / Integer.parseInt(num2)+"";
}
}
package com.app;
public class OperationMultiply implements Strategy{
@Override
public String doOperation(String num1, String num2) {
return Integer.parseInt(num1) * Integer.parseInt(num2)+"";
}
}
package com.app;
public class OperationSubtract implements Strategy{
@Override
public String doOperation(String num1, String num2) {
return Integer.parseInt(num1) - Integer.parseInt(num2)+"";
}
}
package com.app; public interface Strategy { public String doOperation(String num1, String num2); }
使用策略设计模式,代码可以运行