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

题目:

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

代码:

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;
    }

}

运行截图:

 

posted @ 2019-10-01 20:52  02孙帅群  阅读(136)  评论(0编辑  收藏  举报