MST

星途 面试题库

面试题:Java接口与抽象类在复杂系统架构设计中的最佳实践选择

假设你正在设计一个大型、复杂且扩展性要求高的Java系统架构,描述在何种具体业务场景下会优先选择使用接口,何种场景下会优先选择抽象类,说明理由并结合实际案例(如电商系统、游戏开发等)进行阐述。
30.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

优先选择接口的场景及理由

  1. 场景:在电商系统中,不同类型的支付方式(如支付宝支付、微信支付、银联支付等)。这些支付方式都有共同的行为,如发起支付、查询支付结果,但具体实现细节不同。
  2. 理由:接口主要用于实现多态,不同的类可以实现同一个接口,以提供不同的行为实现。它可以让不相关的类实现同一个接口,实现解耦,方便系统的扩展。比如在电商系统里,后续若要添加新的支付方式(如Apple Pay),只需创建一个新类实现支付接口即可,不会影响到其他支付方式的代码。
  3. 示例代码
public interface Payment {
    void initiatePayment(double amount);
    String queryPaymentStatus(String paymentId);
}

public class AlipayPayment implements Payment {
    @Override
    public void initiatePayment(double amount) {
        // 支付宝支付发起逻辑
    }

    @Override
    public String queryPaymentStatus(String paymentId) {
        // 支付宝查询支付状态逻辑
        return "";
    }
}

public class WeChatPayment implements Payment {
    @Override
    public void initiatePayment(double amount) {
        // 微信支付发起逻辑
    }

    @Override
    public String queryPaymentStatus(String paymentId) {
        // 微信查询支付状态逻辑
        return "";
    }
}

优先选择抽象类的场景及理由

  1. 场景:在游戏开发中,创建不同类型的角色(如战士、法师、刺客等),这些角色都有一些共有的属性(如生命值、魔法值)和行为(如移动、攻击),同时又有各自的独特属性和行为。
  2. 理由:抽象类可以为一组相关的类提供一个通用的基类,包含部分已经实现的方法和一些抽象方法。它可以利用继承机制,避免代码重复,子类继承抽象类可以复用部分代码。例如在游戏角色场景中,战士、法师、刺客都继承自角色抽象类,角色抽象类中已经实现了通用的移动方法,而攻击方法可以定义为抽象,由子类根据自身特点实现。
  3. 示例代码
public abstract class Character {
    protected int health;
    protected int mana;

    public Character(int health, int mana) {
        this.health = health;
        this.mana = mana;
    }

    public void move() {
        // 通用的移动逻辑
    }

    public abstract void attack();
}

public class Warrior extends Character {
    public Warrior(int health, int mana) {
        super(health, mana);
    }

    @Override
    public void attack() {
        // 战士的攻击逻辑
    }
}

public class Mage extends Character {
    public Mage(int health, int mana) {
        super(health, mana);
    }

    @Override
    public void attack() {
        // 法师的攻击逻辑
    }
}