我是怎么在实习中是怎么使用设计模式的
需求描述
组长给了我们一个需求,把实际部门映射到企业微信部门并给我们六七十条映射规则,让我们编写代码实现根据部门名字就可返回对应的企业微信部门名字。
解决方案
难道直接在一个方法里写六七十条if语句,为了便于后续业务拓展,经过一些讨论后,我们使用了策略者模式,按照映射规则的特点将这些映射规则按类别大致分为了四类(策略具体实现类),这里暂定为(BranchA、BranchB、BranchC、BranchD),然后再在每个实现类里用正则匹配每条映射规则。
代码实现
抽象策略类
public interface DeptMappingStrategy {
/**
* 部门映射方法,将部门按照规则映射
* @param deptName 原部门名字
* @return 映射后的名字
*/
String doMapping(String deptName);
}
具体实现类
/**
* A类部门映射策略实现
*/
public class BranchAMappingStrategy implements DeptMappingStrategy{
@Override
public String doMapping(String deptName) {
// 其实每个实现类里还有许多映射规则,我是用多条正则匹配实现的,这里我直接返回了
return "我是类型A";
}
}
/**
* B类部门映射策略实现
*/
public class BranchBMappingStrategy implements DeptMappingStrategy{
@Override
public String doMapping(String deptName) {
// 其实每个实现类里还有许多映射规则,我是用多条正则匹配实现的,这里我直接返回了
return "我是类型B";
}
}
C、D类一样
环境类
/**
* 环境类具体使用哪个策略(为了简单和迎合业务需求,这里编写方法直接返回结果)
*/
public class DeptMappingContext {
public DeptMappingStrategy deptMappingStrategy;
private BranchAMappingStrategy branchAMappingStrategy;
private BranchBMappingStrategy branchBMappingStrategy;
private BranchCMappingStrategy branchCMappingStrategy;
private BranchDMappingStrategy branchDMappingStrategy;
public DeptMappingContext() {
this.branchAMappingStrategy = new BranchAMappingStrategy();
this.branchBMappingStrategy = new BranchBMappingStrategy();
this.branchCMappingStrategy = new BranchCMappingStrategy();
this.branchDMappingStrategy = new BranchDMappingStrategy();
}
// 为了简单和迎合业务需求,这里编写方法直接返回结果
public String selectDeptMappingStrategy(String deptName) {
if (deptName == null || deptName.isEmpty()) {
return "";
}
// 选择策略
if (deptName.contains("A")) {
deptMappingStrategy = branchAMappingStrategy;
} else if (deptName.contains("B")) {
deptMappingStrategy = branchBMappingStrategy;
} else if (deptName.contains("C")) {
deptMappingStrategy = branchCMappingStrategy;
} else if (deptName.contains("D")) {
deptMappingStrategy = branchDMappingStrategy;
} else {
throw new IllegalArgumentException("无类型");
}
return deptMappingStrategy.doMapping(deptName);
}
}
客户端
/**
* 测试
*/
public class Client {
public static void main(String[] args) {
DeptMappingContext deptMappingContext = new DeptMappingContext();
String str1 = "A类型";
String str2 = "B类型";
String result1 = deptMappingContext.selectDeptMappingStrategy(str1);
String result2 = deptMappingContext.selectDeptMappingStrategy(str2);
System.out.println(result1); // 我是类型A
System.out.println(result2); // 我是类型B
}
}
第一次在工作中使用设计模式,这里仅写了大致方法,因为现实部门的复杂性,其实映射规则或多或少会不适用,实际开发中涉及了大量正则匹配、字符串操作与转换和额外的逻辑判断。
有好的建议,欢迎大家评论区交流和私信。