本文目录导读:

我来通过一个完整的案例,帮你掌握Java接口的实操方法。
基础案例:支付系统接口
定义接口
// 支付接口
public interface Payment {
// 抽象方法(接口中的方法默认是public abstract)
void pay(double amount);
// 默认方法(Java 8+)
default void showPaymentInfo() {
System.out.println("执行支付操作");
}
// 静态方法(Java 8+)
static boolean validateAmount(double amount) {
return amount > 0;
}
}
实现接口
// 支付宝支付实现
public class AlipayImpl implements Payment {
@Override
public void pay(double amount) {
if (!Payment.validateAmount(amount)) {
System.out.println("金额无效");
return;
}
System.out.println("支付宝支付:" + amount + "元");
// 实际的支付宝支付逻辑
}
}
// 微信支付实现
public class WechatPayImpl implements Payment {
@Override
public void pay(double amount) {
if (!Payment.validateAmount(amount)) {
System.out.println("金额无效");
return;
}
System.out.println("微信支付:" + amount + "元");
// 实际的微信支付逻辑
}
}
使用接口
public class PaymentDemo {
public static void main(String[] args) {
// 面向接口编程
Payment payment1 = new AlipayImpl();
Payment payment2 = new WechatPayImpl();
// 调用接口方法
payment1.pay(100.0);
payment2.pay(200.0);
// 调用默认方法
payment1.showPaymentInfo();
// 调用接口静态方法
System.out.println(Payment.validateAmount(50.0)); // true
}
}
进阶案例:多种接口实现
定义多个接口
// 可支付接口
public interface Payable {
void pay();
}
// 可退款接口
public interface Refundable {
void refund();
}
// 可通知接口
public interface Notifiable {
void sendNotification();
}
一个类实现多个接口
// 订单类实现多个接口
public class Order implements Payable, Refundable, Notifiable {
private String orderId;
private double amount;
private String userEmail;
public Order(String orderId, double amount, String userEmail) {
this.orderId = orderId;
this.amount = amount;
this.userEmail = userEmail;
}
@Override
public void pay() {
System.out.println("订单 " + orderId + " 支付 " + amount + "元");
}
@Override
public void refund() {
System.out.println("订单 " + orderId + " 退款 " + amount + "元");
}
@Override
public void sendNotification() {
System.out.println("发送通知到邮箱:" + userEmail);
}
}
使用接口引用
public class OrderService {
public static void main(String[] args) {
Order order = new Order("ORD001", 299.0, "user@example.com");
// 使用不同的接口引用
Payable payable = order;
Refundable refundable = order;
Notifiable notifiable = order;
// 只能调用各自接口定义的方法
payable.pay();
refundable.refund();
notifiable.sendNotification();
// 接口类型检查
if (payable instanceof Order) {
Order originalOrder = (Order) payable;
System.out.println("订单ID: " + originalOrder.orderId);
}
}
}
综合案例:策略模式应用
定义策略接口
// 计算价格策略接口
public interface PriceStrategy {
double calculatePrice(double originalPrice);
}
// 会员折扣策略
public class VipPriceStrategy implements PriceStrategy {
@Override
public double calculatePrice(double originalPrice) {
return originalPrice * 0.8; // 8折
}
}
// 节日促销策略
public class HolidayPriceStrategy implements PriceStrategy {
@Override
public double calculatePrice(double originalPrice) {
return originalPrice * 0.6; // 6折
}
}
// 满减策略
public class FullReductionStrategy implements PriceStrategy {
@Override
public double calculatePrice(double originalPrice) {
if (originalPrice >= 300) {
return originalPrice - 50; // 满300减50
}
return originalPrice;
}
}
使用策略模式
public class ShoppingCart {
private PriceStrategy priceStrategy;
// 设置策略
public void setPriceStrategy(PriceStrategy strategy) {
this.priceStrategy = strategy;
}
// 计算最终价格
public double calculateFinalPrice(double originalPrice) {
if (priceStrategy == null) {
return originalPrice;
}
return priceStrategy.calculatePrice(originalPrice);
}
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
double price = 350.0;
// 使用不同策略
cart.setPriceStrategy(new VipPriceStrategy());
System.out.println("VIP价格: " + cart.calculateFinalPrice(price));
cart.setPriceStrategy(new HolidayPriceStrategy());
System.out.println("节日价格: " + cart.calculateFinalPrice(price));
cart.setPriceStrategy(new FullReductionStrategy());
System.out.println("满减价格: " + cart.calculateFinalPrice(price));
}
}
实际开发中的接口应用
数据访问层接口
// 数据访问对象接口
public interface UserDao {
// CRUD操作
boolean insertUser(User user);
boolean deleteUser(int id);
boolean updateUser(User user);
User findUserById(int id);
List<User> findAllUsers();
}
// 实现类
public class UserDaoImpl implements UserDao {
@Override
public boolean insertUser(User user) {
// JDBC或MyBatis操作
System.out.println("插入用户: " + user.getName());
return true;
}
@Override
public boolean deleteUser(int id) {
System.out.println("删除用户ID: " + id);
return true;
}
@Override
public boolean updateUser(User user) {
System.out.println("更新用户: " + user.getName());
return true;
}
@Override
public User findUserById(int id) {
// 模拟查询
return new User(id, "测试用户", "test@example.com");
}
@Override
public List<User> findAllUsers() {
return Arrays.asList(
new User(1, "张三", "zhangsan@example.com"),
new User(2, "李四", "lisi@example.com")
);
}
}
最佳实践总结
接口命名规范
- 形容词命名:
Serializable,Comparable - 能力命名:
Runnable,Closable - 以
able表示具有某种能力
设计原则
// 1. 接口隔离原则 - 不要设计臃肿的接口
// ❌ 不好的设计
public interface BadAnimal {
void fly();
void swim();
void run();
}
// ✅ 好的设计
public interface Flyable {
void fly();
}
public interface Swimmable {
void swim();
}
public interface Runnable {
void run();
}
实际应用场景
- 服务层接口:定义业务逻辑
- DAO层接口:数据访问抽象
- 远程调用接口:RPC服务定义
- 回调接口:事件处理
通过以上案例,你可以看到接口在实际开发中的强大作用:定义规范、实现多态、降低耦合,建议从简单的支付系统案例开始练习,逐步掌握接口的精髓。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播