前言
Java中的接口类通常是为了提取共同点,规范实现,便于阅读,处理好接口类多实现并提供优雅的命中具体实现,能够帮助我们简化代码,提高可读性;下面介绍几种用起来很舒服的多实现方式及调用方式供大家参考。
示例
枚举实现
接口定义
public interface Breakfast {
void eat();
}
复制代码
实现
public enum BreakfastEnum implements Breakfast {
Beijing("北京") {
@Override
public void eat() {
System.out.println("北京人早餐吃豆汁和焦圈");
}
},
Wuhan("武汉") {
@Override
public void eat() {
System.out.println("武汉人早餐吃热干面、豆皮...");
}
},
Unknown("未知") {
@Override
public void eat() {
System.out.println("不吃早餐!");
}
};
private String city;
BreakfastEnum(String city) {
this.city = city;
}
private String getCity() {
return this.city;
}
/**
* 提供统一入口 找到对应子类并执行
*
* @param city
*/
public static void eat(String city) {
BreakfastEnum[] values = BreakfastEnum.values();
Arrays.stream(values).filter(e -> city.equals(e.city)).findFirst().orElse(Unknown).eat();
}
}
复制代码
测试一下
通过枚举类实现接口,每一个枚举相当于一个实现,在代码块实现方法即可,最后在枚举类提供一个静态方法作为统一入口,调用方便,代码简洁,提供通用实现处理无特定实现的场景,适合用于替换ifelse较多的业务代码,优化复杂的工具类等等,对于方法很多,业务复杂的业务慎用。
常规多实现(调用示例)
业务场景
我们有一个消息服务用于监听消息并发送到客户端,消息中有一个发布方式字段
- 1.根据消息的发布方式字段发送到指定途径
- 2.将消息发到所有途径
接口定义
public interface MessageHandle {
/**
* 发布消息
*
* @param msg
*/
void publish(JSONObject msg);
}
复制代码
实现
/**
* 发送短信
*/
@Service("sms")
public class SmsMessageHandle implements MessageHandle {
@Override
public void publish(JSONObject msg) {
// 发送短信
// 省略实现...
}
}
/**
* 推送
*/
@Service("push")
public class PushMessageHandle implements MessageHandle {
@Override
public void publish(JSONObject msg) {
// 推送到app
// 省略实现...
}
}
复制代码
应用
// 1.指定途径发送
@Component
public class MessageListener {
@Autowired
private Map<String, MessageHandle> messageHandleMap;
@KafkaListener(groupId = "message-server", topics = "message")
public void listener(String message, Acknowledgment ack) {
JSONObject messageJson = JSON.parseObject(message);
// 获取发布方式 sms push...对应实现@Service注解中的名称
String publishType = messageJson.getString("publishType");
// 获取实现
MessageHandle handle = messageHandleMap.get(publishType);
if(handle != null) {
handle.publish(messageJson);
}
// 提交偏移量
ack.acknowledge();
}
}
复制代码
// 2.每种途径都发送
@Component
public class MessageListener {
@Autowired
private List<MessageHandle> messageHandleList;
@KafkaListener(groupId = "message-server", topics = "message")
public void listener(String message, Acknowledgment ack) {
JSONObject messageJson = JSON.parseObject(message);
// 每种途径都发送
for(MessageHandle handle : messageHandleList){
handle.publish(messageJson);
}
// 提交偏移量
ack.acknowledge();
}
}
复制代码
近期评论