一个坏掉的番茄
Published on 2017-09-02 11:31 in 暂未分类 with Simon Ma

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

题目描述

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

源代码

Shape 接口

package com.tomotoes.probleam.nine;

public interface Shape {
	double getArea();
}

工厂类

package com.tomotoes.probleam.nine;

import com.tomotoes.probleam.nine.shapes.*;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.function.Supplier;

public class Factory {
	private static Scanner scanner = new Scanner(System.in);

	private static double input() {
		return scanner.nextDouble();
	}

	private static Map<String, Supplier<Shape>> factory = new HashMap<>();

	static {
		factory.put("rect", () -> new Rect(input(), input()));
		factory.put("circle", () -> new Circle(input()));
		factory.put("square", () -> new Square(input()));
		factory.put("trapezoid", () -> new Trapezoid(input(), input(), input()));
		factory.put("triangle", () -> new Triangle(input(), input(), input()));
	}

	public static Shape getInstance(String type) {
		return factory.getOrDefault(type, () -> null).get();
	}
}

主类

package com.tomotoes.probleam.nine;

import com.tomotoes.probleam.nine.shapes.Column;

import java.util.Objects;
import java.util.Scanner;

public class App {
	private static Scanner scanner = new Scanner(System.in);

	public static void init() {
		System.out.println("矩形类:   输入 rect -> Rect(宽,长)");
		System.out.println("圆形类:   输入 circle -> Circle(半径)");
		System.out.println("三角形类: 输入 triangle -> Triangle(底边,高,斜边)");
		System.out.println("正方形类: 输入 square -> Square(边长)");
		System.out.println("梯形类: 输入 trapezoid -> Trapezoid(顶边,底边,高)");
		System.out.printf("输入其他值, 程序退出.\n\n");
	}

	public static void main(String[] args) {
		init();
		while (true) {
			System.out.println("请输入类型参数: ");
			final String input = scanner.next().trim().toLowerCase();

			System.out.println("请输入类所需的构造参数: ");
			Shape shape = Factory.getInstance(input);

			if (Objects.isNull(shape)) {
				System.out.println("程序退出.");
				return;
			}

			System.out.println("请输入柱体的高: ");
			final double height = scanner.nextDouble();

			Column column = new Column(height, shape);
			System.out.printf("柱体的体积为: " + column.getVolume() + "\n\n");
		}

	}
}

柱体类

package com.tomotoes.probleam.nine.shapes;

import com.tomotoes.probleam.nine.Shape;

public class Column {
	double height;
	Shape shape;

	public Column(double height, Shape shape) {
		this.height = height;
		this.shape = shape;
	}

	public double getVolume() {
		return height * shape.getArea();
	}
}

矩形类

package com.tomotoes.probleam.nine.shapes;

import com.tomotoes.probleam.nine.Shape;

public class Rect implements Shape {
	double width;
	double length;

	public Rect(double width, double length) {
		this.width = width;
		this.length = length;
	}

	@Override
	public double getArea() {
		return width * length;
	}
}

圆形类

package com.tomotoes.probleam.nine.shapes;

import com.tomotoes.probleam.nine.Shape;

public class Circle implements Shape {
	double radius;

	public Circle(double radius) {
		this.radius = radius;
	}

	@Override
	public double getArea() {
		return Math.pow(radius, 2) * Math.PI;
	}
}

正方形类

package com.tomotoes.probleam.nine.shapes;

import com.tomotoes.probleam.nine.Shape;

public class Square implements Shape {
	double length;

	public Square(double length) {
		this.length = length;
	}

	@Override
	public double getArea() {
		return length * length;
	}
}

梯形类

package com.tomotoes.probleam.nine.shapes;

import com.tomotoes.probleam.nine.Shape;

public class Trapezoid implements Shape {
	double top;
	double base;
	double height;

	public Trapezoid(double top, double base, double height) {
		this.top = top;
		this.base = base;
		this.height = height;
	}

	@Override
	public double getArea() {
		return (top + base) * height * 2;
	}
}

三角形类

package com.tomotoes.probleam.nine.shapes;

import com.tomotoes.probleam.nine.Shape;

public class Triangle implements Shape {
	double base;
	double height;
	double oblique;

	public Triangle(double base, double height, double oblique) {
		this.base = base;
		this.height = height;
		this.oblique = oblique;
	}

	@Override
	public double getArea() {
		return base * height / 2;
	}
}

运行截图

posted @ 2019-10-01 20:39  SimonMa  阅读(145)  评论(0编辑  收藏  举报