基于MVP的计算器的设计与实现
时间: 2023-08-05 13:03:45 浏览: 128
MVP(Model-View-Presenter)是一种常用的软件架构模式,它可以帮助我们将应用程序的逻辑与用户界面分离,使得我们的代码更加清晰和易于维护。
下面是基于MVP的计算器的设计与实现:
1. 模型层(Model)
模型层负责计算器的核心逻辑,包括实现加减乘除等基本运算,以及处理用户输入和输出结果。我们可以定义一个接口来描述模型层的行为,例如:
```java
public interface CalculatorModel {
void add(double num1, double num2);
void subtract(double num1, double num2);
void multiply(double num1, double num2);
void divide(double num1, double num2);
void clear();
String getResult();
}
```
2. 视图层(View)
视图层负责显示用户界面,并将用户的输入传递给Presenter层进行处理。我们可以定义一个接口来描述视图层的行为,例如:
```java
public interface CalculatorView {
void showResult(String result);
void showError(String error);
}
```
3. 表现者层(Presenter)
表现者层充当模型和视图之间的桥梁,负责协调它们之间的交互。它从视图层接收用户输入,然后调用模型层进行计算,并将结果显示在视图层上。我们可以定义一个Presenter类来实现这个接口,例如:
```java
public class CalculatorPresenterImpl implements CalculatorPresenter {
private CalculatorView mView;
private CalculatorModel mModel;
public CalculatorPresenterImpl(CalculatorView view) {
mView = view;
mModel = new CalculatorModelImpl();
}
@Override
public void add(double num1, double num2) {
mModel.add(num1, num2);
mView.showResult(mModel.getResult());
}
@Override
public void subtract(double num1, double num2) {
mModel.subtract(num1, num2);
mView.showResult(mModel.getResult());
}
@Override
public void multiply(double num1, double num2) {
mModel.multiply(num1, num2);
mView.showResult(mModel.getResult());
}
@Override
public void divide(double num1, double num2) {
if (num2 == 0) {
mView.showError("Cannot divide by zero");
} else {
mModel.divide(num1, num2);
mView.showResult(mModel.getResult());
}
}
@Override
public void clear() {
mModel.clear();
mView.showResult("");
}
}
```
4. 实现
最后,我们需要将模型、视图和表现者结合在一起,来实现一个完整的计算器应用程序。我们可以在MainActivity中来实现这个功能,例如:
```java
public class MainActivity extends AppCompatActivity implements CalculatorView {
private EditText mNum1EditText;
private EditText mNum2EditText;
private TextView mResultTextView;
private CalculatorPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mNum1EditText = findViewById(R.id.num1_edittext);
mNum2EditText = findViewById(R.id.num2_edittext);
mResultTextView = findViewById(R.id.result_textview);
mPresenter = new CalculatorPresenterImpl(this);
}
public void onAddButtonClick(View view) {
double num1 = Double.parseDouble(mNum1EditText.getText().toString());
double num2 = Double.parseDouble(mNum2EditText.getText().toString());
mPresenter.add(num1, num2);
}
public void onSubtractButtonClick(View view) {
double num1 = Double.parseDouble(mNum1EditText.getText().toString());
double num2 = Double.parseDouble(mNum2EditText.getText().toString());
mPresenter.subtract(num1, num2);
}
public void onMultiplyButtonClick(View view) {
double num1 = Double.parseDouble(mNum1EditText.getText().toString());
double num2 = Double.parseDouble(mNum2EditText.getText().toString());
mPresenter.multiply(num1, num2);
}
public void onDivideButtonClick(View view) {
double num1 = Double.parseDouble(mNum1EditText.getText().toString());
double num2 = Double.parseDouble(mNum2EditText.getText().toString());
mPresenter.divide(num1, num2);
}
public void onClearButtonClick(View view) {
mPresenter.clear();
}
@Override
public void showResult(String result) {
mResultTextView.setText(result);
}
@Override
public void showError(String error) {
Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
}
}
```
在这个示例中,我们使用了Android的EditText和TextView控件来实现用户界面,并通过按钮的点击事件来调用Presenter层的方法。在Presenter层中,我们使用了CalculatorModelImpl来实现CalculatorModel接口,并根据用户输入来调用相应的方法进行计算。最后,我们实现了CalculatorView接口来显示计算结果,并在出错时显示错误消息。
阅读全文