第9次作业--接口及接口回调
题目:
利用接口和接口回调,实现简单工厂模式,当输入不同的字符,代表相应图形时,利用工厂类获得图形对象,再计算以该图形为底的柱体体积。
Shape.java
1.定义接口Shape
2.getArea方法
1 package dbm; 2 3 public interface Shape { //接口类Shape 4 double getArea(); //getArea方法 5 6 }
Factory.java
1.getShape方法获得底面图形
2.switch方法根据键盘的输入来选择底面图形并给底面图形各数据赋值
1 package dbm; 2 3 import java.util.Scanner; 4 5 public class Factory { // 工厂类 6 7 Shape getShape(char c) { // getShape方法获得底面图形 8 9 Shape shape = null; 10 switch (c) { 11 case 's': // 三角形 12 System.out.println("请输入三角形的三边长:"); 13 Scanner reader = new Scanner(System.in); 14 double a1 = reader.nextDouble(); 15 double a2 = reader.nextDouble(); 16 double a3 = reader.nextDouble(); 17 shape = new Triangle(a1, a2, a3); 18 System.out.println("以三角形为底的柱体体积为:"); 19 break; 20 case 'j': // 矩形 21 System.out.println("请输入矩形的长和宽:"); 22 Scanner reader1 = new Scanner(System.in); 23 double a4 = reader1.nextDouble(); 24 double a5 = reader1.nextDouble(); 25 shape = new Rectangle(a4, a5); 26 System.out.println("以矩形为底的柱体体积为:"); 27 break; 28 29 case 'z': // 正方形 30 System.out.println("请输入正方形的边长:"); 31 Scanner reader3 = new Scanner(System.in); 32 double a6 = reader3.nextDouble(); 33 shape = new Square(a6); 34 System.out.println("以正方形为底的柱体体积为:"); 35 break; 36 case 't': // 梯形 37 System.out.println("请输入梯形的上底下底和高:"); 38 Scanner reader4 = new Scanner(System.in); 39 double b1 = reader4.nextDouble(); 40 double b2 = reader4.nextDouble(); 41 double b3 = reader4.nextDouble(); 42 shape = new Trapezoid(b1, b2, b3); 43 System.out.println("以梯形为底的柱体体积为:"); 44 break; 45 case 'y': // 圆 46 System.out.println("请输入圆的半径:"); 47 Scanner reader5 = new Scanner(System.in); 48 double b4 = reader5.nextDouble(); 49 shape = new Circle(b4); 50 System.out.println("以圆为底的柱体的体积为:"); 51 break; 52 } 53 return shape; 54 55 } 56 }
Rectangle,java
1.创建矩形类使用Shape接口
2.对接口中的getArea方法重写,实现求矩形面积功能
1 package dbm; 2 3 public class Rectangle implements Shape { //矩形类使用Shape接口 4 double length; //length width两个变量表示矩形的长和宽 5 double width; 6 7 public Rectangle(double length, double width) { //构造方法给长和宽赋值 8 this.length = length; 9 this.width = width; 10 } 11 12 public double getArea() { //对接口中的抽象方法重写 实现求矩形面积功能 13 return length * width; 14 } 15 }
Square.java
1.创建正方形类继承矩形类
2.构造方法使用super关键字调用父类中的构造方法并将参数side传给形参
1 package dbm; 2 3 public class Square extends Rectangle { //正方形类继承矩形类 4 5 public Square(double side) { //构造方法使用super关键字调用父类中的构造方法并将参数side传给形参 6 super(side, side); 7 } 8 9 }
Triangle.java
1.创建三角形类使用Shape接口
2.重写接口中的getArea方法实现求三角形面积功能
1 package dbm; 2 3 public class Triangle implements Shape { //三角形类使用Shape接口 4 double a; //定义变量a,b,c表示三角形三边长 5 double b; 6 double c; 7 public Triangle(double a,double b,double c){ //构造方法赋初值 8 this.a=a; 9 this.b=b; 10 this.c=c; 11 } 12 @Override 13 public double getArea() { //重写接口中的方法实现求三角形面积功能 14 double p=(a+b+c)/2; 15 return Math.sqrt(p*(p-a)*(p-b)*(p-c)); 16 17 } 18 19 }
Trapezoid.java
1.创建梯形类使用Shape接口
2.重写接口中的方法实现求梯形面积的功能
1 package dbm; 2 3 public class Trapezoid implements Shape { //梯形类使用Shape接口 4 double top; //定义top,under,h三个变量表示梯形的上底、下底和高 5 double under; 6 double h; 7 public Trapezoid(double top,double under,double h){ //构造方法赋初值 8 this.top=top; 9 this.under=under; 10 this.h=h; 11 } 12 @Override 13 public double getArea() { //重写接口中的方法实现求梯形面积功能 14 15 return (top+under)*h/2; 16 } 17 18 }
Circle.java
1.创建圆类使用Shape接口
2.重写接口中的方法求圆的面积
1 package dbm; 2 3 public class Circle implements Shape { // 圆类使用Shape接口 4 double r; 5 6 public Circle(double r) { //构造方法给半径赋值 7 this.r = r; 8 } 9 10 @Override 11 public double getArea() { // 对接口中的方法重写 实现求圆形面积功能 12 return Math.PI * r * r; 13 14 } 15 16 }
Zhuti.java
1.创建柱体类使用Shape接口
2.由于使用了接口,所以必须重写构造方法
3.定义求柱体体积的方法
1 package dbm; 2 3 public class Zhuti implements Shape { //柱体类使用Shape接口 4 double height; //定义height变量表示矩形的高,定义shape对象来表示具体的底面图形 5 Shape shape; 6 7 public Zhuti(Shape shape,double height){ 8 this.shape=shape; 9 this.height=height; 10 } 11 @Override 12 public double getArea() { //重写接口构造方法 13 14 return 0; 15 } 16 17 public static double getVolume(double area, double height) { //定义求柱体体积的方法 18 return area * height; 19 } 20 21 22 }
Test.java
1.测试类通过键盘输入选择底面的图形
2.创建工厂对象,调用工厂里的getShape方法获得底面图形
3.调用柱体求体积方法求得体积
1 package dbm; 2 3 import java.util.Scanner; 4 5 public class Test { 6 7 public static void main(String[] args) { 8 9 System.out.println("请选择柱体以什么为底:"); 10 System.out.println("s:三角形 j:矩形 z:正方形 t:梯形 y:圆"); 11 Scanner sc = new Scanner(System.in); 12 char c = sc.next().charAt(0); 13 System.out.println("请输入柱体的高:"); 14 double d = sc.nextDouble(); 15 Factory factory = new Factory(); 16 Shape shape = factory.getShape(c); // 求底 17 18 System.out.println(Zhuti.getVolume(shape.getArea(), d)); // 调用柱体求体积方法求得体积 19 } 20 21 }
测试结果
1.以三角形为底面图形的柱体
2.以矩形为底面图形的柱体
3.以正方形为底面图形的柱体
4.以梯形为底面图形的柱体
5.以圆形为底面图形的柱体