题目:
利用接口和接口回调,实现简单工厂模式,当输入不同的字符,代表相应图形时,利用工厂类获得图形对象,再计算以该图形为底的柱体体积。
1.代码实现:
Test.java
/** * 1.主类Test,主方法main,while循环,if else控制语句,字符变量x * 2.变量x用来接收用户输入的字符,if 执行退出, else 创建工厂对象,柱体对象,输出体积 * 3.if 通过break退出循环,结束程序,else 调用fy.getShape(x)方法,给柱体对象传新参 * */ package cn.edu.ccut.po; import java.util.Scanner; public class Test { public static void main(String[] args) { while(true) {//while 无限循环 System.out.println("请输入你需要的图形对应的字符:矩形(j)正方形(z)三角形(s)圆形(y)梯形(t),退出输入:B!"); Scanner in = new Scanner(System.in); char x = in.next().charAt(0);//接收用户输入的字符 if(x=='B') {//退出程序条件 System.out.println("已退出程序!"); break; } else { Factory fy = new Factory();//创建 工厂的对象 Zhuti zt = new Zhuti(fy.getShape(x),fy.h);//创建柱体对象zt,调用getShape方法得到新的shape和h的值 System.out.println(zt.getVolume());//输出主体的体积 } } } }
Factory.java 工厂模式
/** * 1.一个主类Factory,4个成员变量,一个方法getShape,switch控制语句 * 2.Factory工厂类用来封装方法,成员变量分别用来存储用户输入的值,局部变量shape用来获取新的图形 * 3.通过方法里面的参数判断进入switch哪条语句,然后执行赋值语句,给shape赋新值, * 跳出循环返回shape值 * */ package cn.edu.ccut.po; import java.util.Scanner; public class Factory {//工厂类 double a,b,c,h; Shape getShape(char x) { Shape shape=null;//接口变量 Scanner in = new Scanner(System.in); switch(x){ case 'j': System.out.print("请分别输入矩形的宽、长、柱体的高:"); a = in.nextDouble();//读入宽 b = in.nextDouble();//读入长 h = in.nextDouble();//读入高 shape = new Rectangle(a,b);//接口回调 System.out.print("矩形柱体的体积为:"); break; case 'z': System.out.print("请分别输入正方形的边长、柱体的高:"); a = in.nextDouble();//读入边长 h = in.nextDouble();//读入高 shape = new Zfx(a);//接口回调 System.out.print("正方形柱体的体积为:"); break; case 's': System.out.print("请分别输入三角形的三边长、柱体的高:"); a = in.nextDouble();//读入边长 b = in.nextDouble();//读入边长 c = in.nextDouble();//读入边长 h = in.nextDouble();//读入高 shape = new Triangle(a,b,c);//接口回调 System.out.print("三角形柱体的体积为:"); break; case 'y': System.out.print("请分别输入圆形的半径、柱体的高:"); a = in.nextDouble();//读入圆的半径 h = in.nextDouble();//读入高 shape = new Circle(a);//接口回调 System.out.print("圆形柱体的体积为:"); break; case 't': System.out.print("请分别输入梯形的上边和下边、柱体的高:"); a = in.nextDouble();//读入梯形的上边 b = in.nextDouble();//读入梯形的下边 h = in.nextDouble();//读入高 shape = new Trapezium(a,b);//接口回调 System.out.print("梯形柱体的体积为:"); break; } return shape;//返回接口变量 } }
Shape.java
/** * 1.创建接口Shape * 2.声明抽象方法getArea * 3.实现该接口的类都可以使用该方法 * */ package cn.edu.ccut.po; public interface Shape {//接口Shape public abstract double getArea();//getArea方法声明 }
Zhuti.java 柱体
/** * 1.主类Zhuti,成员变量 shape high,有参方法Zhuti(),无参方法getVolume(),换底方法huanDi(); * 2.shape 是接口变量,接收接口的类的对象引用,high代表高 * 3.Zhuti通过局部变量给成员变量赋值,获取新值,getVolume通过调用对应的面积方法*高求得体积 * */ package cn.edu.ccut.po; public class Zhuti { Shape shape; double high; Zhuti(Shape shape,double high){ this.shape=shape; this.high=high; } double getVolume() {//求体积方法 return shape.getArea()*high;//柱体体积 } void huanDi(Shape shape) {//换底方法 this.shape=shape; } }
Rectangle.java 矩形
/** * 1.主类矩形类,实现接口Shape,成员变量width,lengh,有参方法Rectangle,无参方法getArea() * 2.width,lengh分别代表宽和长,getArea() 求矩形面积 * 3.Rectangle方法通过局部变量给成员变量赋值,获取新值,getArea()通过成员变量相乘求得面积 * */ package cn.edu.ccut.po; public class Rectangle implements Shape{//实现接口Shape double width; double lengh; Rectangle(double width,double lengh){ this.width=width; this.lengh=lengh; } public double getArea() {//实现接口中的方法 return width*lengh;//矩形面积 } }
Zfx.java 正方形
/** * 1.主类Zfx继承Rectangle类,方法Zfx,无参方法getArea() * 2.方法Zfx 传参并调用父类方法,getArea()求面积 * 3.Zfx通过调用父类方法传给其新的参数,重写getArea方法 两边相乘求得面积 * */ package cn.edu.ccut.po; public class Zfx extends Rectangle{//继承父类矩形 Zfx(double side){ super(side,side);//调用父类方法 } public double getArea() {//重写父类方法 return width*width;//正方形面积 } }
Triangle.java 三角形
/** * 1.主类Triangle实现Shape接口,成员变量abc,方法Triangle,面积方法getArea() * 2.成员变量abc代表三角形三边,getArea()重写接口的方法 * 3.getArea()方法重写了接口的方法,根据三边长通过面积公式求得三角形面积 * */ package cn.edu.ccut.po; public class Triangle implements Shape{//实现接口Shape double a,b,c; Triangle(double a,double b,double c){//三边参数 this.a=a; this.b=b; this.c=c; } public double getArea() {//实现接口中的方法 double p = (a+b+c)/2; return Math.sqrt(p*(p-a)*(p-b)*(p-c));//三角形面积 } }
Circle.java 圆形
/** * 1.主类Circle实现接口Shape,成员变量PI,r,方法getArea() * 2.PI代表圆周率,r是圆的半径,getArea()重写接口的方法 * 3.getArea()重写了接口的方法,通过接受的新半径r 通过公式求得圆的面积 * */ package cn.edu.ccut.po; public class Circle implements Shape{//实现接口Shape double PI =3.14; double r; Circle(double r){ this.r=r; } public double getArea() {//实现接口中的方法 return PI*(r*r);//圆的面积 } }
Trapezium.java 梯形
/** * 1.主类Trapezium梯形继承了矩形类Rectangle, * 2.方法Trapezium传参并调用父类方法,方法getArea()求面积 * 3.Trapezium通过调用父类方法传给其新的参数,重写getArea方法 通过公式求得梯形面积 * */ package cn.edu.ccut.po; public class Trapezium extends Rectangle{//继承矩形类 Trapezium(double top,double base){ super(top,base);//调用父类的方法 } public double getArea(){//实现接口中的方法 return (width+lengh)/2;//梯形面积 } }