例:获取房间名称(函数式编程)

优雅的获取不同组合方式的房间名称,哈哈
直接上代码(含注释)

package com.example.demo.book;

import java.util.function.Function;

/**
 * 背景:
 * 认购书中每个项目对房间全称的显示有个性化需求,
 * 所以根据不同的方式写出不同的函数
 * 后期扩展:
 * 如果后期的项目使用的方式存在,直接配置映射关系就行
 * 如果后期的项目要使用新的方式,增加新的实现逻辑,然后配置映射关系就行
 * 题外话:
 * 此类仅公开get方法提供访问,其他方法没有必要,所有是私有的
 * (想过用策略模式(原理就是方法重写实现的),但需要写很多的类,感觉太臃肿)
 */
public class RoomName {

    private static final Function roomNameOfA = e -> {
        return "楼栋名称+房间名称";
    };

    private static final Function roomNameOfB = e -> {
        return "楼栋名称+单元名称+房间名称";
    };

    private static final Function 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 
     * @return
     */
    private static String getRoomName(String type) {
        Function function = getFunction(type);
        return function.apply(type);
    }

    /**
     * 获取对应方式的函数(如果方式很多可以放到Map集合里面,方便拿取)
     *
     * @param type 组成房间名称的方式
     * @return
     */
    private static Function 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> 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> map){
        for (Map.Entry> entry : map.entrySet()) {
            if (entry.getValue().contains(projectId)) {
                return entry.getKey();
            }
        }
        return "default";
    }
    
}

你可能感兴趣的:(例:获取房间名称(函数式编程))