第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.以圆形为底面图形的柱体

 

 

 

 

posted @ 2019-10-07 18:36  丁宝铭  阅读(203)  评论(0编辑  收藏  举报