实习中是怎么使用策略者模式的

我是怎么在实习中是怎么使用设计模式的

需求描述

组长给了我们一个需求,把实际部门映射到企业微信部门并给我们六七十条映射规则,让我们编写代码实现根据部门名字就可返回对应的企业微信部门名字。

解决方案

难道直接在一个方法里写六七十条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
    }
}

第一次在工作中使用设计模式,这里仅写了大致方法,因为现实部门的复杂性,其实映射规则或多或少会不适用,实际开发中涉及了大量正则匹配、字符串操作与转换和额外的逻辑判断。
有好的建议,欢迎大家评论区交流和私信。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-62

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值