java使用开闭原则、MVC结构、GUI,求底为三角形、梯形、圆的柱形的体积。
时间: 2023-06-15 11:06:33 浏览: 164
好的,我可以给你提供一个基于开闭原则和MVC结构的Java程序来计算底为三角形、梯形、圆的柱形的体积,并且使用GUI界面来操作。
首先,我们需要创建一个MVC结构的程序,其中Model层用于处理数据逻辑,View层用于展示GUI界面,Controller层用于协调Model和View的交互。下面是一个简单的代码示例:
Model层:
```java
public class Cylinder {
private double baseArea;
private double height;
private double volume;
public double getBaseArea() {
return baseArea;
}
public void setBaseArea(double baseArea) {
this.baseArea = baseArea;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getVolume() {
return volume;
}
public void calculateVolume() {
volume = baseArea * height;
}
}
```
View层:
```java
import javax.swing.*;
import java.awt.*;
public class CylinderView extends JFrame {
private JLabel baseLabel;
private JLabel heightLabel;
private JLabel volumeLabel;
private JTextField baseField;
private JTextField heightField;
private JButton calculateButton;
public CylinderView() {
setTitle("Cylinder Volume Calculator");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new GridLayout(3, 2));
baseLabel = new JLabel("Base Area:");
heightLabel = new JLabel("Height:");
volumeLabel = new JLabel("Volume:");
baseField = new JTextField();
heightField = new JTextField();
calculateButton = new JButton("Calculate");
panel.add(baseLabel);
panel.add(baseField);
panel.add(heightLabel);
panel.add(heightField);
panel.add(volumeLabel);
panel.add(calculateButton);
add(panel);
setVisible(true);
}
public double getBase() {
return Double.parseDouble(baseField.getText());
}
public double getHeight() {
return Double.parseDouble(heightField.getText());
}
public void setVolume(double volume) {
volumeLabel.setText("Volume: " + volume);
}
public void addCalculateListener(ActionListener listener) {
calculateButton.addActionListener(listener);
}
}
```
Controller层:
```java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CylinderController {
private Cylinder model;
private CylinderView view;
public CylinderController(Cylinder model, CylinderView view) {
this.model = model;
this.view = view;
view.addCalculateListener(new CalculateListener());
}
class CalculateListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
model.setBaseArea(view.getBase());
model.setHeight(view.getHeight());
model.calculateVolume();
view.setVolume(model.getVolume());
}
}
}
```
接下来,我们需要根据底面形状来创建不同的模型类,例如Triangle、Trapezoid和Circle类,并且让它们都继承自Cylinder类,并且重写calculateVolume()方法来计算体积。下面是这些类的代码示例:
Triangle类:
```java
public class Triangle extends Cylinder {
private double base;
public double getBase() {
return base;
}
public void setBase(double base) {
this.base = base;
}
public void setBaseArea(double baseArea) {
this.base = Math.sqrt(baseArea * 4 / Math.sqrt(3));
super.setBaseArea(baseArea);
}
public void calculateVolume() {
super.calculateVolume();
setVolume(getVolume() / 3);
}
}
```
Trapezoid类:
```java
public class Trapezoid extends Cylinder {
private double base1;
private double base2;
public double getBase1() {
return base1;
}
public void setBase1(double base1) {
this.base1 = base1;
}
public double getBase2() {
return base2;
}
public void setBase2(double base2) {
this.base2 = base2;
}
public void setBaseArea(double baseArea) {
this.base1 = (baseArea * 2) / (getHeight() + Math.sqrt(Math.pow(getHeight(), 2) + 4 * Math.pow(baseArea, 2)));
this.base2 = (baseArea * 2) / (getHeight() - Math.sqrt(Math.pow(getHeight(), 2) + 4 * Math.pow(baseArea, 2)));
super.setBaseArea(baseArea);
}
public void calculateVolume() {
super.calculateVolume();
setVolume(getVolume() / 3);
}
}
```
Circle类:
```java
public class Circle extends Cylinder {
private double radius;
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
setBaseArea(Math.PI * Math.pow(radius, 2));
}
}
```
最后,我们可以创建一个CylinderApp类来启动程序,并且根据用户选择来创建不同的模型类,并且将其传递给Controller和View。下面是这个类的代码示例:
```java
public class CylinderApp {
public static void main(String[] args) {
String[] options = {"Triangle", "Trapezoid", "Circle"};
int option = JOptionPane.showOptionDialog(null, "Select base type:", "Cylinder Volume Calculator", JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
Cylinder model;
CylinderView view = new CylinderView();
switch (option) {
case 0:
model = new Triangle();
view.setTitle("Triangle Cylinder Volume Calculator");
break;
case 1:
model = new Trapezoid();
view.setTitle("Trapezoid Cylinder Volume Calculator");
break;
case 2:
model = new Circle();
view.setTitle("Circle Cylinder Volume Calculator");
break;
default:
model = new Cylinder();
break;
}
CylinderController controller = new CylinderController(model, view);
}
}
```
现在,你可以运行这个程序,并且选择不同的底面形状来计算柱形的体积了。希望这个程序对你有所帮助!