多态在图形绘制系统中通过统一接口(如抽象类shape或接口)实现不同形状的面积计算,各子类独立实现getarea()方法,客户端仅面向抽象编程,无需类型判断,新增形状不影响原有逻辑。

多态在图形绘制系统中,核心是用统一接口处理不同形状的面积计算——让每个具体形状自己决定怎么算,调用方只管“问面积”,不用关心它是圆还是三角形。
定义统一的抽象基类或接口
这是多态的起点。不直接实例化“形状”,而是约定所有形状都必须提供 getArea() 方法:
- 用 abstract class Shape:适合有共性属性(如颜色、是否填充)或默认行为
- 用 interface Shape:更轻量,纯契约,适合关注行为一致性
例如:
public abstract class Shape {<br> protected String name;<br> public Shape(String name) { this.name = name; }<br> public abstract double getArea(); // 强制子类实现<br>}各具体形状独立实现面积逻辑
每个子类只专注自己的数学规则,互不影响:
- Rectangle:长 × 宽
- Circle:π × 半径²
- Triangle:0.5 × 底 × 高(或用海伦公式)
示例:
public class Circle extends Shape {<br> private double radius;<br> public Circle(double radius) {<br> super("Circle");<br> this.radius = radius;<br> }<br> @Override<br> public double getArea() {<br> return Math.PI * radius * radius;<br> }<br>}客户端代码完全解耦,只面向抽象编程
绘图系统、统计模块、UI渲染器等,只需持有 Shape 类型的引用,调用 getArea() 即可:
- 可以存进 List
统一管理 - 遍历时无需 if-else 判断类型,避免硬编码分支
- 新增形状(如 Ellipse)时,原有计算逻辑完全不用改
示例:
List<shape> shapes = Arrays.asList(<br> new Rectangle(4.0, 5.0),<br> new Circle(3.0),<br> new Triangle(6.0, 4.0)<br>);<br><br>double totalArea = shapes.stream()<br> .mapToDouble(Shape::getArea)<br> .sum(); // 自动调用各自实现</shape>
配合工厂或策略模式提升扩展性
当形状创建逻辑变复杂(如从 JSON 解析、用户选择类型),可引入简单工厂:
- 输入字符串 "circle" → 返回 Circle 实例
- 客户端仍只操作 Shape,不感知 new 了谁
- 后续加新形状,只改工厂,不改业务代码
这样整个面积计算流程就真正做到了:**一个入口、多种实现、零条件判断、高可维护**。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











