优先选择接口的场景及理由
- 场景:在电商系统中,不同类型的支付方式(如支付宝支付、微信支付、银联支付等)。这些支付方式都有共同的行为,如发起支付、查询支付结果,但具体实现细节不同。
- 理由:接口主要用于实现多态,不同的类可以实现同一个接口,以提供不同的行为实现。它可以让不相关的类实现同一个接口,实现解耦,方便系统的扩展。比如在电商系统里,后续若要添加新的支付方式(如Apple Pay),只需创建一个新类实现支付接口即可,不会影响到其他支付方式的代码。
- 示例代码:
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 "";
}
}
优先选择抽象类的场景及理由
- 场景:在游戏开发中,创建不同类型的角色(如战士、法师、刺客等),这些角色都有一些共有的属性(如生命值、魔法值)和行为(如移动、攻击),同时又有各自的独特属性和行为。
- 理由:抽象类可以为一组相关的类提供一个通用的基类,包含部分已经实现的方法和一些抽象方法。它可以利用继承机制,避免代码重复,子类继承抽象类可以复用部分代码。例如在游戏角色场景中,战士、法师、刺客都继承自角色抽象类,角色抽象类中已经实现了通用的移动方法,而攻击方法可以定义为抽象,由子类根据自身特点实现。
- 示例代码:
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() {
// 法师的攻击逻辑
}
}