題目:
利用接口和接口回調,實現簡單工廠模式,當輸入不同的字符,代表相應圖形時,利用工廠類獲得圖形對象,再計算以該圖形為底的柱體體積。
代碼:
1、Test.java
1 /** 2 * 測試類,包含一個主方法; 3 * 調用求體積方法輸出; 4 */ 5 package cn.edu.ccut.object3; 6 7 import java.util.Scanner; 8 public class Test { 9 10 public static void main(String[] args) { 11 char c; 12 while(true){ 13 System.out.println("請輸入柱體底的形狀('j'矩形、's'三角形、'z'正方形、't'梯形、'y'圓形、'F'結束程序):"); 14 Scanner reader = new Scanner(System.in); 15 c = reader.next().charAt(0); //c接受字符型輸入; 16 if(c == 'F'){ //退出程序標志; 17 System.out.println("程序結束!"); 18 break; 19 } 20 factory f = new factory(); 21 Cone cone = new Cone(f.ctrl_di(c) , 5); //定義矩形對象,根據用戶輸出控制底,高為5; 22 System.out.println("柱體體積是:"+cone.getV()); 23 } 24 } 25 26 }
2、factory.java
1 /** 2 * 工廠類,實現簡單工廠模式,包含一個方法; 3 * ctrl_di實現了根據用戶輸入換底; 4 */ 5 package cn.edu.ccut.object3; 6 7 public class factory { 8 Shape shape = null; 9 public Shape ctrl_di(char c){ //實現了根據用戶輸入換底; 10 switch(c){ 11 case 'j':shape = new Rec(3,4);break; 12 case 's':shape = new Triangle(3,4,5);break; 13 case 'z':shape = new Zheng(2);break; 14 case 't':shape = new Trapezoid(4,6,7);break; 15 case 'y':shape = new Circle(3);break; 16 default:System.out.println("error"); 17 } 18 return shape; 19 } 20 }
3、Shape.java
1 /** 2 * 圖形接口; 3 * 定義了一個計算面積的抽象方法getArea; 4 */ 5 package cn.edu.ccut.object3; 6 7 public interface Shape { 8 public double getArea(); //抽象方法計算面積; 9 }
4、Rec.java
1 /** 2 * 矩形類,使用了圖形接口,包含兩個成員變量一個構造方法,並重寫了getArea方法; 3 * 兩個成員變量分別代表舉行的長和寬; 4 * 構造方法初始化,getArea計算面積; 5 */ 6 package cn.edu.ccut.object3; 7 8 public class Rec implements Shape { 9 double a; 10 double b; 11 Rec(double a , double b){ 12 this.a = a; 13 this.b = b; 14 } 15 public double getArea(){ 16 return (a*b); 17 } 18 }
5、Zheng.java
1 /** 2 * 正方形類,繼承了矩形類,包含兩個方法; 3 * 構造方法初始化,getArea計算面積 4 */ 5 package cn.edu.ccut.object3; 6 7 public class Zheng extends Rec { 8 Zheng(double a){ 9 super(a, a); //利用super調用父類構造方法; 10 } 11 12 public double getArea(){ //方法重寫; 13 return (a*a); 14 } 15 }
6、Circle.java
1 /** 2 * 圓類,使用了圖形接口,包含一個成員變量,兩個方法; 3 * 成員變量r為半徑; 4 * 構造方法初始化,重寫了getArea方法; 5 */ 6 package cn.edu.ccut.object3; 7 8 public class Circle implements Shape{ 9 double r; 10 11 public Circle(double r){ 12 this.r = r; 13 } 14 public double getArea(){ 15 return (Math.PI*r*r); 16 } 17 }
7、Triangle.java
1 /** 2 * 三角形類,使用了圖形接口,包含了三個成員變量,兩個方法; 3 * 成員變量a,b,c分別代表三角形的三個邊; 4 * 構造方法初始化,重寫了getArea方法; 5 */ 6 package cn.edu.ccut.object3; 7 8 public class Triangle implements Shape{ 9 double a; 10 double b; 11 double c; 12 13 public Triangle (double a , double b , double c){ 14 this.a = a; 15 this.b = b; 16 this.c = c; 17 } 18 public double getArea(){ 19 double p = (a + b + c) / 2; 20 return Math.sqrt(p * (p - a) * (p - b) * (p - c)); 21 } 22 }
8、Trapezoid.java
1 /** 2 * 梯形類,使用了圖形接口,包含三個成員變量,兩個方法; 3 * 成員變量a,b代表梯形的上底和下底,high代表高; 4 * 構造方法,重寫getArea; 5 */ 6 package cn.edu.ccut.object3; 7 8 public class Trapezoid implements Shape{ 9 double a; 10 double b; 11 double high; 12 13 public Trapezoid(double a , double b , double high){ 14 this.a = a; 15 this.b = b; 16 this.high = high; 17 } 18 public double getArea(){ 19 return (((a + b) * high) / 2); 20 } 21 }
9、Cone.java
1 /** 2 * 柱體類,兩個成員變量,三個方法; 3 * 成員變量shape代表底,high代表高; 4 * 構造方法初始化,getV計算柱體體積,setDi可用於換底; 5 */ 6 package cn.edu.ccut.object3; 7 8 public class Cone { 9 Shape shape; 10 double high; 11 public Cone(Shape shape , double high){ 12 this.shape = shape; 13 this.high = high; 14 } 15 public double getV(){ 16 return (shape.getArea()*high); 17 } 18 public void setDi(Shape shape){ //利用修改器換底 19 this.shape = shape; 20 } 21 }
運行結果: