面向对象多态接口设计应聚焦行为契约,命名体现职责(如PaymentProcessor),方法简洁统一、无实现细节;实现类各司其职(如SmsNotificationSender),客户端仅依赖接口;配合工厂或策略模式解耦,严守单一职责与接口稳定原则。

设计直观的面向对象接口来支撑多态,关键在于让调用方“只关心行为,不操心是谁在做”。接口要清晰表达意图,命名体现职责,方法签名简洁一致,同时为扩展留出自然路径。
接口定义聚焦行为契约
接口名应是名词性能力描述,比如 PaymentProcessor、NotificationSender、DataValidator,而不是 IPayment 或 BaseNotify。每个方法代表一个明确动作,参数尽量精简,返回值语义统一。
- 避免在接口里暴露实现细节,如
sendEmailBySMTP();应定义为send(Notification notification) - 所有方法默认是 public abstract,不用显式写;也不该含字段或构造逻辑
- 可搭配默认方法提供通用基础逻辑(如日志、空值校验),但核心行为仍由实现类决定
配合实现类形成自然多态链
每个具体实现类对应一种明确场景,类名直白反映其角色,比如 SmsNotificationSender、PushNotificationSender、EmailNotificationSender。它们都实现同一接口,但内部逻辑完全独立。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 客户端代码只依赖接口类型:
NotificationSender sender = new SmsNotificationSender(); - 运行时调用
sender.send(...),自动执行对应实现,无需 if-else 判断类型 - 新增渠道(如 WebhookNotificationSender)只需新写一个类,不改已有代码
结合工厂或策略模式提升可用性
直接 new 实现类虽可行,但耦合调用方与具体类型。更直观的做法是封装选择逻辑:
立即学习“Java免费学习笔记(深入)”;
- 用简单工厂返回接口实例:
NotificationSender sender = NotificationFactory.create("sms"); - 或用策略模式按上下文自动匹配:
sender = strategyRouter.route(notification.getType()); - Spring 等框架中可直接注入接口,由容器按 @Qualifier 或条件自动装配
避免常见设计陷阱
接口一旦发布,修改成本高,所以初期就要克制:
- 不为“可能有用”加方法,只放当前真实需要的行为
- 不把多个不相关的职责塞进一个接口(违反单一职责),比如
UserService不该同时管登录、发邮件、导报表 - 不把子类特有方法强行上提到接口——那是破坏抽象,不是多态

















