设计模式之工厂模式-策略模式


不要在代码里面写多个if else了

1、工厂注册类

package com.cpmc.cpmcwms.finance.fatory;

import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import com.cpmc.cpmcwms.finance.service.MeasureUnitAbstract;
import lombok.experimental.UtilityClass;

import java.util.HashMap;
import java.util.Map;

/**
 * @author wuzhenyong
 * ClassName:MeasureUnitFactory.java
 * date:2022-03-08 13:45
 * Description: 工厂模式
 */
@UtilityClass
public class MeasureUnitFactory {
    
    
    public final static Map<String, MeasureUnitAbstract> MEASURE_UNIT_ABSTRACT_MAP = new HashMap<>();

    /**
     * 获得计量单位服务
     *
     * @param unit 单位
     * @return {@link MeasureUnitAbstract}
     */
    public MeasureUnitAbstract getMeasureUnitService(String unit) {
    
    
        return MEASURE_UNIT_ABSTRACT_MAP.get(unit);
    }

    /**
     * 计量单位注册服务
     *
     * @param unit                单位
     * @param measureUnitAbstract 注册服务
     */
    public void registerMeasureUnitService(String unit, MeasureUnitAbstract measureUnitAbstract) {
    
    
        if (CharSequenceUtil.isBlank(unit) || ObjectUtil.isEmpty(measureUnitAbstract)) {
    
    
            return;
        }
        MEASURE_UNIT_ABSTRACT_MAP.put(unit, measureUnitAbstract);
    }

}

2、工厂抽象类

package com.cpmc.cpmcwms.finance.service;

import com.cpmc.cpmcwms.finance.dto.CostCalculateDTO;
import org.springframework.beans.factory.InitializingBean;

/**
 * @author wuzhenyong
 * ClassName:MeasureUnitAbstract.java
 * date:2022-03-08 13:40
 * Description:
 */
public abstract class MeasureUnitAbstract implements InitializingBean {
    
    
    // 方法自定义
    public void calculateCost(CostCalculateDTO dto) {
    
     }
}

3、抽象子类

  • 子类1

package com.cpmc.cpmcwms.finance.service.impl;

import com.cpmc.cpmcwms.finance.constant.FinanceConstant;
import com.cpmc.cpmcwms.finance.dto.CostCalculateDTO;
import com.cpmc.cpmcwms.finance.fatory.MeasureUnitFactory;
import com.cpmc.cpmcwms.finance.service.MeasureUnitAbstract;
import org.springframework.stereotype.Component;

/**
 * @author wuzhenyong
 * ClassName:MeasureUnitYuanService.java
 * date:2022-03-08 13:51
 * Description:单位元
 */
@Component
public class MeasureUnitYuanService extends MeasureUnitAbstract {
    
    

    /**
     * 计算
     */
    @Override
    public void calculateCost(CostCalculateDTO dto) {
    
    
        System.out.println("单位元");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
    
    
        MeasureUnitFactory.registerMeasureUnitService(FinanceConstant.CALCULATE_UNIT_TYPE_ZERO, this);
    }
}

  • 子类2

package com.cpmc.cpmcwms.finance.service.impl;

import com.cpmc.cpmcwms.finance.constant.FinanceConstant;
import com.cpmc.cpmcwms.finance.dto.CostCalculateDTO;
import com.cpmc.cpmcwms.finance.fatory.MeasureUnitFactory;
import com.cpmc.cpmcwms.finance.service.MeasureUnitAbstract;
import org.springframework.stereotype.Component;

/**
 * @author wuzhenyong
 * ClassName:MeasureUnitYuanCarService.java
 * date:2022-03-08 13:51
 * Description:单位元/车
 */
@Component
public class MeasureUnitYuanCarService extends MeasureUnitAbstract {
    
    

    /**
     * 计算
     */
    @Override
    public void calculateCost(CostCalculateDTO dto) {
    
    
        System.out.println("单位元/车");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
    
    
        MeasureUnitFactory.registerMeasureUnitService(FinanceConstant.CALCULATE_UNIT_TYPE_ONE, this);
    }
}

4、测试类

@Test
    @SneakyThrows
    void should_Yuan_success_then_factory_given_0() {
    
    
        MeasureUnitAbstract measureUnitService = MeasureUnitFactory.getMeasureUnitService("0");
        measureUnitService.calculateCost(new CostCalculateDTO());
    }

控制塔打印

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IswhmGJo-1650973374232)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20220308141245260.png)]

猜你喜欢

转载自blog.csdn.net/A_yonga/article/details/124435468