题目:
利用接口和接口回调,实现简单工厂模式,当输入不同的字符,代表相应图形时,利用工厂类获得图形对象,再计算以该图形为底的柱体体积。
代码:
1、主类——Test:一个方法,两个对象
/** * 调用Scanner方法 *在主函数中使用while语句控制图形的选择和计算结果的输出、 *定义了两个对象:Foctory类的对象——fo,Cone类的对象——cone *并给cone对象初始化 */ package cn.deu.ccut.nine; import java.util.Scanner; public class Test { public static void main(String[] args) { while(true){ Scanner reader = new Scanner(System.in); System.out.println("请输入你选择的形状:矩形j,三角形s,圆y,梯形T,正方形Z"); char c = reader.next().charAt(0); Foctory fo = new Foctory(); Cone cone = new Cone(fo.getShape(c), fo.higt); System.out.println("该柱体的体积为:"+cone.getVolume()); System.out.println("是否继续计算,是按1,否按任意键"); if(1!=reader.nextDouble()) { System.out.println("结束"); break; } } } }
2、接口——Shape:
/** * 创建形状接口 Shape */ package cn.deu.ccut.nine; public interface Shape { //Shape higt = null; double getArea(); }
3、工厂类——Foctory类:一个方法、一个switch语句
/** * 定义一个工厂类——Foctory类 * 定义一个Shape接口的对象——shape * 使用switch语句,将计算结果赋给shape对象 */ package cn.deu.ccut.nine; import java.util.Scanner; import java.util.*; public class Foctory { public static double higt; static Scanner reader = new Scanner(System.in); static Shape shape=null; public static Shape getShape(char c){ switch(c){ case 'z': System.out.println("请输入正方形的边长:"); double width=reader.nextDouble(); shape=new Square(width); System.out.println("请输入以正方形为底的柱体高:"); higt=reader.nextDouble(); break; case 's': System.out.println("请输入三角形的三边长"); double x=reader.nextDouble(); double y=reader.nextDouble(); double z=reader.nextDouble(); shape=new Triangle(x,y,z); System.out.println("请输入以三角形为底的柱体高:"); higt=reader.nextDouble(); break; case 'j': System.out.println("请输入矩形的长和宽"); double kuan=reader.nextDouble(); double chang=reader.nextDouble(); shape=new Rectangle(kuan,chang); System.out.println("请输入以矩形为底的柱体高:"); higt=reader.nextDouble(); break; case 'y': System.out.println("请输入圆的半径"); double r=reader.nextDouble(); shape=new Circle(r); System.out.println("请输入以圆形为底的柱体高:"); higt=reader.nextDouble(); break; case 't': System.out.println("请输入梯形的上底、下底、高"); double sd=reader.nextDouble(); double xd=reader.nextDouble(); double tg=reader.nextDouble(); shape=new Trapezoid(sd,xd,tg); System.out.println("请输入以梯形为底的柱体高:"); higt=reader.nextDouble(); break; } return shape; } }
4、柱体类——Cone:一个成员变量、一个对象变量、两个方法
/** * 定义一个柱体类——Cone类 * 定义一个成员变量high,一个shape对象变量 * 定义一个构造方法计算柱体体积 * 定义一个修改器修改对象值 */ package cn.deu.ccut.nine; public class Cone { Shape shape; double high; public Cone(Shape shape,double high){ this.shape = shape; this.high = high; } public void setRect(Shape shape){ this.shape = shape; } public double getVolume(){ return shape.getArea() * high; } }
5、矩形类——Rectangle类:两个成员变量、两个方法
/** * 定义了一个矩形类——Rectangle类,该类调用了Shape接口 * 定义了两个成员变量:宽——width、长——length * 定义了两个方法:构造方法(为width、length赋值)、getArea(计算矩形的面积) */ package cn.deu.ccut.nine; public class Rectangle implements Shape{ double width; double length; public Rectangle (double width,double length) { this.width=width; this.length=length; } public double getArea() { return width*length; } }
6、正方形子类——Square子类:一个构造方法、一个向上造型
/** * 定义了一个正方形类——Square,该类继承了Rectangle类 * 定义了一个构造方法,方法体内执行向上造型操作 */ package cn.deu.ccut.nine; public class Square extends Rectangle{ public Square(double width) { super(width, width); } }
7、三角形类——Triangle类:三个成员变量、两个方法
/** * 定义了一个三角形类——Triangle类,该类调用了Shape接口 * 定义了三个成员变量分别为三角行的三边:x、y、z * 定义了两个方法:构造方法(分别为三个边赋值)、getArea(计算三角形的面积) */ package cn.deu.ccut.nine; public class Triangle implements Shape{ double x; double y; double z; public Triangle(double x,double y,double z) { this.x=x; this.y=y; this.z=z; } public double getArea() { double p=(x+y+z)/2.0; return Math.sqrt(p*(p-x)*(p-y)*(p-z)); } }
8、圆类——Circle类:两个成员变量、两个方法
/** * 定义了一个计算圆面积的类——Circle类 * Circle类调用了Shape接口 * 两个个成员变量:Π——pai、半径——r * 两个方法:构造方法(为半径r赋值)、getArea(计算圆的面积) */ package cn.deu.ccut.nine; public class Circle implements Shape{ double pai=3.14; double r; public Circle(double r){ this.r=r; } public double getArea() { return pai*r*r; } }
9、梯形类——Trapezoid类:三个成员变量、两个方法
/** * 定义了计算梯形面积的类——Trapezoid类,该类调用了Shape接口 * 定义了三个成员变量:上底——up、下底——down、高——high * 定义了两个方法:构造方法(为up、down、high、赋值)、getArea(计算梯形的面积) */ package cn.deu.ccut.nine; public class Trapezoid implements Shape{ double up; double down; double high; public Trapezoid(double up,double down,double high) { this.down=down; this.high=high; this.up=up; } public double getArea() { return (up+down)*high/2.0; } }