面试题答案
一键面试switch语句参数类型限制带来的潜在问题
- 扩展性受限:当需要添加新的3D图形类型时,由于switch语句参数类型固定为现有的
ShapeType
枚举,若新类型无法直接融入该枚举,需要修改枚举定义,可能影响到现有依赖该枚举的其他代码。 - 代码耦合度高:每个图形类型的绘制逻辑都写在同一个switch语句块中,若某一图形类型的绘制逻辑发生较大变化,可能影响到其他图形类型的代码,维护成本增加。
- 可读性和可维护性降低:随着图形类型增多,switch语句块会变得庞大复杂,难以快速定位和理解特定图形类型的绘制逻辑。
遵循参数限制前提下的可扩展性架构设计
- 策略模式:
- 定义一个接口
ShapeRenderer
,包含一个draw
方法。
public interface ShapeRenderer { void draw(); }
- 为每种图形类型创建实现该接口的具体类,例如
CircleRenderer
、RectangleRenderer
等。
public class CircleRenderer implements ShapeRenderer { @Override public void draw() { // 圆形绘制逻辑 } }
- 在枚举
ShapeType
中添加一个属性,指向对应的渲染器实例。
public enum ShapeType { CIRCLE(new CircleRenderer()), RECTANGLE(new RectangleRenderer()); private ShapeRenderer renderer; ShapeType(ShapeRenderer renderer) { this.renderer = renderer; } public ShapeRenderer getRenderer() { return renderer; } }
- 在绘制逻辑中,通过
ShapeType
获取对应的渲染器实例并调用draw
方法。
ShapeType shapeType = ShapeType.CIRCLE; shapeType.getRenderer().draw();
- 当需要添加新的3D图形类型时,只需创建新的渲染器类实现
ShapeRenderer
接口,并在ShapeType
枚举中添加新的枚举值和对应的渲染器实例,无需修改原有绘制逻辑的主体代码。
- 定义一个接口
- 工厂模式辅助:
- 可以结合工厂模式,创建一个
ShapeFactory
类来创建不同类型的图形渲染器。
public class ShapeFactory { public static ShapeRenderer createRenderer(ShapeType shapeType) { switch (shapeType) { case CIRCLE: return new CircleRenderer(); case RECTANGLE: return new RectangleRenderer(); default: return null; } } }
- 这样在绘制逻辑中,可以通过工厂方法获取渲染器。
ShapeType shapeType = ShapeType.CIRCLE; ShapeRenderer renderer = ShapeFactory.createRenderer(shapeType); if (renderer != null) { renderer.draw(); }
- 当添加新的图形类型时,只需在
ShapeFactory
的createRenderer
方法的switch
语句中添加新的分支,提高了代码的可维护性和可扩展性。
- 可以结合工厂模式,创建一个