多态允许父类引用指向子类对象,结合接口或抽象类,可将变化点隔离,实现“对修改关闭,对扩展开放”(OCP)。以下两个案例展示如何通过多态大幅提升系统扩展性。
场景:主板运行后需启动网卡、声卡等外设。若主板直接依赖具体网卡/声卡类,新增外设需修改主板代码,违反 OCP。
解决:定义 PCI 接口,主板依赖抽象:
interface PCI {
void open();
void close();
}
class MainBoard {
public void run() { System.out.println("mainboard run"); }
public void usePCI(PCI p) { // 面向接口编程
if (p != null) {
p.open();
p.close();
}
}
}
class NetCard implements PCI { ... }
class SoundCard implements PCI { ... }
// 客户端
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(new NetCard()); // 新增外设只需新增实现类,无需改动 MainBoard
mb.usePCI(new SoundCard());
核心:MainBoard 依赖 PCI 接口,通过向上转型(父类引用指向子类对象)调用统一操作。新增外设只需实现 PCI,零修改主板代码。
场景:系统需支持 JDBC 与 Hibernate 两种持久化方式,且未来可能新增。
解决:定义 UserInfoDao 接口封装增删改查:
interface UserInfoDao {
void add(User user);
void delete(User user);
}
class UserInfoByJDBC implements UserInfoDao {
public void add(User u) { /* JDBC 连接、SQL、关闭 */ }
public void delete(User u) { /* JDBC 连接、SQL、关闭 */ }
}
class UserInfoByHibernate implements UserInfoDao {
public void add(User u) { /* Hibernate 连接、SQL、关闭 */ }
public void delete(User u) { /* Hibernate 连接、SQL、关闭 */ }
}
// 使用
UserInfoDao dao = new UserInfoByHibernate(); // 切换只需换实现类
dao.add(user);
dao.delete(user);
业务层仅依赖 UserInfoDao,切换持久化框架仅需替换实例化对象,甚至可结合工厂模式/依赖注入实现配置化切换。
PCI、UserInfoDao)。掌握多态扩展性,是编写可维护、可演进 Java 系统的基石。