题目:
利用接口和接口回调,实现简单工厂模式,当输入不同的字符,代表相应图形时,利用工厂类获得图形对象,再计算以该图形为底的柱体体积。
代码:
aa.java
1 package aaa; 2 3 public class aa implements dd { // 接口 4 double r; 5 6 public aa(double r) { 7 this.r = r; 8 } 9 10 @Override 11 public double getArea() { 12 return Math.PI * r * r; 13 14 } 15 16 }
bb.java
1 package aaa; 2 3 import java.util.Scanner; 4 5 public class bb { // 类 6 7 dd getShape(char c) { 8 9 dd 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 hh(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 cc(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 ee(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 gg(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 aa(b4); 50 System.out.println("以圆为底的柱体的体积为:"); 51 break; 52 } 53 return shape; 54 55 } 56 }
cc.java
1 package aaa; 2 3 public class cc implements dd { //矩形类使用Shape接口 4 double length; 5 double width; 6 7 public cc(double length, double width) { 8 this.length = length; 9 this.width = width; 10 } 11 12 public double getArea() { 13 return length * width; 14 } 15 }
dd.java
1 package aaa; 2 3 public interface dd { 4 double getArea(); 5 6 }
ee.java
1 package aaa; 2 3 public class ee extends cc { 4 5 public ee(double side) { 6 super(side, side); 7 } 8 9 }
ff.java
1 package aaa; 2 3 import java.util.Scanner; 4 5 public class ff { 6 7 public static void main(String[] args) { 8 9 System.out.println("选择柱体以什么为底:"); 10 System.out.println("z:正方形 s:三角形 t:梯形 y:圆 j:矩形 "); 11 Scanner sc = new Scanner(System.in); 12 char c = sc.next().charAt(0); 13 System.out.println("输入柱体的高:"); 14 double d = sc.nextDouble(); 15 bb factory = new bb(); 16 dd shape = factory.getShape(c); // 求底 17 18 System.out.println(ii.getVolume(shape.getArea(), d)); 19 } 20 21 }
gg.java
1 package aaa; 2 3 public class gg implements dd { 4 double top; 5 double under; 6 double h; 7 public gg(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 }
hh.java
1 package aaa; 2 3 public class hh implements dd { 4 double a; 5 double b; 6 double c; 7 public hh(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 }
ii.java
1 package aaa; 2 3 public class ii implements dd { 4 double height; //定义height变量表示矩形的高,定义shape对象来表示具体的底面图形 5 dd shape; 6 7 public ii(dd 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 }
运行结果: