首页 > 其他分享 >策略模式+工厂模式取代if{}else{}

策略模式+工厂模式取代if{}else{}

时间:2024-04-03 18:22:55浏览次数:14  
标签:SubjectInfoTypeEnum 取代 策略 实现 模式 else subjectRadio public

1. 策略+工厂实现相同业务抽象

策略模式:一种解耦的方法,它对算法进行封装,使得算法的调用和算法本身分离。使用策略模式客户端代码不需要调整,算法之间可以互相替换,因为不同的算法实现的是同一个接口。策略模式是一种对象行为型模式。策略模式符合“开闭原则”。

1.1 定义策略接口

将成员的业务方法抽象为统一的策略接口。其中 InitializingBean 接口来自Spring框架,用于实现环境的统一工厂。

public interface SubjectTypeHandler {
	/**
	 * 枚举身份的识别
	 */
	SubjectInfoTypeEnum getHandlerType();

	/**
	 * 实际的题目的插入
	 */
	void add(SubjectInfoBO subjectInfoBO);

	/**
	 * 实际的题目的查询
	 */
	SubjectOptionBO query(int subjectId);
}

1.2 实现策略工厂

此处的工厂即策略模式下的 “环境类” 要素,功能为根据不同的name找到其对应的不同的策略实现,实现方法为将实现NameHandler接口的类都装载到strategyMap里,除使用工厂实现外,也可以使用枚举+代理实现。

@Component
public class SubjectTypeHandlerFactory implements InitializingBean {
    @Resource
    private List<SubjectTypeHandler> subjectTypeHandlerList;

    private Map<SubjectInfoTypeEnum, SubjectTypeHandler> handlerMap = new HashMap<>();
    public SubjectTypeHandler getHandler(int subjectType){
        SubjectInfoTypeEnum byCode = SubjectInfoTypeEnum.getByCode(subjectType);
        return handlerMap.get(byCode);
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        for (SubjectTypeHandler subjectTypeHandler : subjectTypeHandlerList) {
            handlerMap.put(subjectTypeHandler.getHandlerType(), subjectTypeHandler);
        }
    }
}

1.3 为各成员实现各自的具体策略实现类

将各自的不同实现类声明为组件(用于维护工厂),org.springframework.beans.factory.InitializingBean#afterPropertiesSet内部实现工厂注册。

/**
 * 单选题目的策略类
 *
 */
@Component
public class RadioTypeHandler implements SubjectTypeHandler {

    @Resource
    private SubjectRadioService subjectRadioService;

    @Override
    public SubjectInfoTypeEnum getHandlerType() {
        return SubjectInfoTypeEnum.RADIO;
    }

    @Override
    public void add(SubjectInfoBO subjectInfoBO) {
        //单选题目的插入
        List<SubjectRadio> subjectRadioList = new LinkedList<>();
        subjectInfoBO.getOptionList().forEach(option -> {
            SubjectRadio subjectRadio = RadioSubjectConverter.INSTANCE.convertBoToEntity(option);
            subjectRadio.setSubjectId(subjectInfoBO.getId());
            subjectRadio.setIsDeleted(IsDeletedFlagEnum.UN_DELETED.getCode());
            subjectRadioList.add(subjectRadio);
        });
        subjectRadioService.batchInsert(subjectRadioList);
    }

    @Override
    public SubjectOptionBO query(int subjectId) {
        SubjectRadio subjectRadio = new SubjectRadio();
        subjectRadio.setSubjectId(Long.valueOf(subjectId));
        List<SubjectRadio> result = subjectRadioService.queryByCondition(subjectRadio);
        List<SubjectAnswerBO> subjectAnswerBOList = RadioSubjectConverter.INSTANCE.convertEntityToBoList(result);
        SubjectOptionBO subjectOptionBO = new SubjectOptionBO();
        subjectOptionBO.setOptionList(subjectAnswerBOList);
        return subjectOptionBO;
    }

}
public class MultipleTypeHandler implements SubjectTypeHandler

......

经过改造,后面如果新增成员或者新功能实现,新增策略实现即可。这种改造符合开闭原则,适用较为复杂的逻辑判断。

标签:SubjectInfoTypeEnum,取代,策略,实现,模式,else,subjectRadio,public
From: https://www.cnblogs.com/chillymint/p/18113309

相关文章

  • BUCK电路的导通模式、工作模式、控制模式
    01/简介 /上图所示,为了区分BUCK电路中的CCM、BCM、DCM、PWM、PFM等概念,从不同的角度,我们将它们分为:导通模式、工作模式和控制模式三个大类。02/导通模式 /从功率电感上的电流是否连续的角度看,降压电路最基本的三种电流传导模式有CCM、BCM和DCM三种。 连续导通模......
  • Go_ if else语句 ,,循环,,switch,,数组
    if-else语句//if语法if定义变量;条件{}elseif条件{}else{}//输入分数,打印成绩等级packagemainimport"fmt"//iffuncmain(){ //1接收用户输入 varscoreint=0 fmt.Print("请输入分数:") fmt.Scan(&score) showLevel(score)......
  • .NET 代理模式(二) 动态代理-DynamicProxy
    前言我们都知道,在.NET中实现动态代理AOP有多种方案,也有很多框架支持,但大多框架的实现原理都是通过Emit配合Activator一起使用,从IL级别上实现动态代理。其实在.NET中有一个更为简单的方案可以实现动态代理,那就是DispatchProxy类。DispatchProxy类DispatchProxy类是.NETCor......
  • vim编辑的三种模式
    命令模式命令模式:进去时默认的模式,光标的移动、复制、删除、粘贴、其他操作。G跳转到最后一行1G跳转到第一行gg跳转到第一行dd剪切10dd剪切十行dw剪切一个单词y复制yy复制一行x剪切一个字符p在光标下一行粘贴u撤回ctrl+r撤回撤回 输入模式输入模式:在命令模式按i键可以进......
  • 【设计模式】单例模式
    一、介绍单例模式是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。 二、单例模式优缺点优点:仅在首次请求单例对象时对其进行初始化你可以保证一个类只有一个实例获得了一个指向该实例的全局访问节点缺点违反了单一职责原则该模......
  • 《解释器模式(极简c++)》
            本文章属于专栏-概述-《设计模式(极简c++版)》-CSDN博客模式说明方案:对每个data建立一个单点解释器对象X,dataA和dataB之间的关系,建立一个关系解释器对象Y,这里的Y处理的是X1和X2。这样,复用了解释单文本的逻辑,和多文本间关系的逻辑。优点:灵活性:易于改变......
  • 使用c++装饰器模式完成 QQ秀这个游戏,给动画人物搭配不同服饰。
    //比如穿T恤,衬衫,外套,皮鞋,运动鞋,靴子...,根据下面的类图完//被装饰的类classPerson{public:   stringm_name;   Person(){};//子类实例化需要无参构造   Person(stringname):m_name(name){}   virtualvoidshow(){cout<<m_name;};};//......
  • 使用c++观察者模式完成主题订阅 消息通知
    //造主题,主题是默认的新闻主页,主题下面还有具体的频道:经济、体育、娱乐。这样主题也分为两个层,观察者可以订阅新闻主页,也可以订阅具体的频道。//观察者模式//抽象类观察者classAbsObserver{public:   virtualvoidupdate(stringcontent)=0;//更新的接口};......
  • Python的四种单例模式实现方式
    ★单例模式基本介绍单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它是一种创建型模式,通常用于需要严格控制某个类的实例数量的情况。单例模式确保一个类在整个应用程序生命周期中只有一个实例,因此可以节省系统资源,同时提供了一个集中的访问......
  • ChatGPT会取代Salesforce顾问吗?
    当ChatGPT问世时,许多Salesforce顾问很乐意使用该工具完成日常任务。然而,许多专业人士仍未使用过该工具或发现它的多种功能。Salesforce顾问负责处理复杂的项目、兼顾客户需求,并在不断发展的生态系统中通过各种云服务保持领先地位。因此,顾问需要适应学习人工智能的新技能,这样才能......