第9次作业--接口及接口回调

题目:

       利用接口和接口回调,实现简单工厂模式,当输入不同的字符,代表相应图形时,利用工厂类获得图形对象,再计算以该图形为底的柱体体积。

Shape.java

1 package com;
2 //接口
3 public interface Shape {
4     double getArea();
5 
6 }

Rectangle.java

 1 package com;
 2 
 3 public class Rectangle implements Shape {
 4     double a;//矩形長
 5     double b;//矩形寬
 6 
 7     public Rectangle(double a, double b) {
 8         this.a = a;
 9         this.b = b;
10     }
11 
12     @Override
13     public double getArea() {
14 
15         return a * b;//返回面積
16     }
17 
18 }

Squera.java


 1 package com;
 2 
 3 public class Squera extends Rectangle {
 4     public Squera(double a) {//正方形的邊
 5         super(a, a);
 6 
 7     }
 8 
 9     public double getArea() {
10         return a * a;
11     }
12 
13 }
 
 1 package com;
 2 
 3 public class Triangle implements Shape {
 4 
 5     double a;//三角形三邊長
 6     double b;
 7     double c;
 8 
 9     public Triangle(double a, double b, double c) {
10         this.a = a;
11         this.b = b;
12         this.c = c;
13     }
14 
15     public double getArea() {
16         double p = (a + b + c) / 2;
17         return Math.sqrt(p * (p - a) * (p - b) * (p - c));//三角形面積
18     }
19 
20 }

Cricle.java

 1 package com;
 2 
 3 public class Cricle implements Shape {
 4 
 5     double r;//半径
 6     double PI = 3.14;
 7 
 8     public Cricle(double r) {
 9         this.r = r;
10     }
11 
12     public double getArea() {
13 
14         return r * r * PI;//
15     }
16 
17 }

Trapezoid.java

 1 package com;
 2 
 3 public class Trapezoid implements Shape {
 4 
 5     double a;//梯形的两边及高
 6     double b;//
 7     double h;//
 8     public Trapezoid(double a,double b,double h) {
 9         this.a=a;
10         this.b=b;
11         this.h=h;
12         // TODO Auto-generated constructor stub
13     }
14     public double getArea() {
15         
16         return (a+b)*h/2;//梯形面积
17     }
18 
19 }

Cone.java

package com;

public class Cone {
    Shape shape;//定義接口變量
    double h;//

    public Cone(Shape shape, double h) {
        this.shape = shape;
        this.h = h;

    }

    public double getV() {//球體積
        return shape.getArea() * h;
    }

    public void changeD() {//換底
        this.shape = shape;
    }
}

Factory.java

 1 package com;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Factory {
 6 
 7     Shape getShape(char c) {
 8         Scanner reader = new Scanner(System.in);
 9         Shape shape = null;
10         switch (c) {//根据字符判断形状
11         case 'R':
12             System.out.println("请输入矩形的长和宽
");
13             shape = new Rectangle(reader.nextInt(), reader.nextDouble());
14             break;
15         case 'Z':
16             System.out.println("请输入正方形的边长,柱体的高
");
17             shape = new Squera(reader.nextDouble());
18             break;
19         case 'C':
20             System.out.println("请输入圆的半径
");
21             shape = new Cricle(reader.nextDouble());
22             break;
23         case 't':
24             System.out.println("请输入三角形的三条边
");
25             shape = new Triangle(reader.nextDouble(), reader.nextDouble(),
26                     reader.nextDouble());
27             break;
28 
29         case 'T':
30             System.out.println("请输入梯形的上底下底和高
");
31             shape = new Trapezoid(reader.nextDouble(), reader.nextDouble(),
32                     reader.nextDouble());
33             break;
34 
35         }
36         return shape;//
37     }
38 }

Test.java

 1 package com;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Test {
 6     public static void main(String[] args) {
 7 
 8         Scanner reader = new Scanner(System.in);
 9         System.out.print("请输入你选择的形状:矩形R,正方形Z,三角形t,圆C,梯形T:
");
10         char c = reader.next().charAt(0);
11         Factory factory = new Factory();
12         Cone cone = new Cone(factory.getShape(c), reader.nextDouble());//获取底面积,高
13         System.out.print(cone.getV());
14 
15     }
16 }
原文地址:https://www.cnblogs.com/hzcxwz/p/11617220.html