优雅的获取不同组合方式的房间名称,哈哈
直接上代码(含注释)
package com.example.demo.book;
import java.util.function.Function;
/**
* 背景:
* 认购书中每个项目对房间全称的显示有个性化需求,
* 所以根据不同的方式写出不同的函数
* 后期扩展:
* 如果后期的项目使用的方式存在,直接配置映射关系就行
* 如果后期的项目要使用新的方式,增加新的实现逻辑,然后配置映射关系就行
* 题外话:
* 此类仅公开get方法提供访问,其他方法没有必要,所有是私有的
* (想过用策略模式(原理就是方法重写实现的),但需要写很多的类,感觉太臃肿)
*/
public class RoomName {
private static final Function<String, String> roomNameOfA = e -> {
return "楼栋名称+房间名称";
};
private static final Function<String, String> roomNameOfB = e -> {
return "楼栋名称+单元名称+房间名称";
};
private static final Function<String, String> roomNameOfDefault = e -> {
return "项目名称+楼栋名称+单元名称+房间名称";
};
/**
* 获取房间名称
*
* @param roomId 房间ID
* @return
*/
public static String get(Integer roomId) {
Integer projectId = getProjectId(roomId);
String type = ProjectConfig.getType(projectId, ProjectConfig.roomNmaeType);
return getRoomName(type);
}
/**
* 通过房间ID获取项目ID(伪代码)
*
* @param roomId 房间ID
* @return
*/
private static Integer getProjectId(Integer roomId) {
return 666;
}
/**
* @param type 房间名称的组成方式
* @param <T>
* @return
*/
private static String getRoomName(String type) {
Function<String, String> function = getFunction(type);
return function.apply(type);
}
/**
* 获取对应方式的函数(如果方式很多可以放到Map集合里面,方便拿取)
*
* @param type 组成房间名称的方式
* @return
*/
private static Function<String, String> getFunction(String type) {
if ("A".equals(type)) {
return roomNameOfA;
}
if ("B".equals(type)) {
return roomNameOfB;
}
return roomNameOfDefault;
}
}
package com.example.demo.book;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 项目相关的配置(可能还会有供款明细,折扣设置等等不同方式的需求)
*/
public class ProjectConfig {
/**
* key:组成房间名称方式的类型(此配置可以放到配置文件中,方便调整)
* val:项目ID
*/
public static final Map<String, List<Integer>> roomNmaeType = new HashMap<>();
static {
roomNmaeType.put("A", Arrays.asList(1, 2, 3));
roomNmaeType.put("B", Arrays.asList(4, 5, 6));
roomNmaeType.put("default", Arrays.asList(7, 8, 9));
}
/**
* 公共方法
* @param projectId 项目ID
* @param map 映射关系
* @return 类型
*/
public static String getType(Integer projectId, Map<String, List<Integer>> map){
for (Map.Entry<String, List<Integer>> entry : map.entrySet()) {
if (entry.getValue().contains(projectId)) {
return entry.getKey();
}
}
return "default";
}
}