码迷,mamicode.com
首页 > 其他好文 > 详细

初识策略模式

时间:2019-11-01 20:34:11      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:返回   erp   mod   任务   div   需要   one   bean   proc   

首先谈谈自己对策略模式的理解:

假如业务需求中需要根据不同的任务种类(假设A B等等)作出不同的处理方式,我们是否要采用if else的方式,逐个判断呢?

if(type=="A"){
    //A的处理逻辑
}else if(type=="B"){
    //B的处理逻辑
}
//........

 

以上写法实现功能自然没有问题,但是随着任务种类的增加,我们需要不停的添加或者修改if else判断语句,以及添加或修改相应的处理逻辑,方法也会非常臃肿,亦不符合面向对象的对修改关闭,对拓展开放的原则。

由此,引入策略模式来解决这个问题。

 

以下是我简单模拟的一个策略模式的代码轮廓,实际应用可能要复杂一些,只表明策略模式的思想: 忘记是参考的哪篇博客了.....

 

Handle接口,作为任务处理器的一个简单抽象,定义来返回类型接口 getType 和 处理任务方法 process ,所有的任务处理类都实现Handle接口,根据不同的类型,对应不同的处理逻辑

TypeEnums 枚举则作为任务类型定义所有的任务种类

public interface Handle<T> {

    /**
     * 处理方法
     * @param t
     */
    void process(T t);

    /**
     * 获取类型
     */
    TypeEnums getType();
}
public enum TypeEnums {

    TYPEA("A", "typeA"),
    TYPEB("B", "typeB");

    @Setter
    @Getter
    private String type;

    @Setter
    @Getter
    private String desc;

    TypeEnums(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
}

ApplicationContextHelper负责获取spring 的容器,通过该容器可以获取到所有实现Handle接口的实现类,也就是所有任务类型的处理器

@Component
public class ApplicationContextHelper implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    public <T> Map<String, T> getBeansOfType(Class<T> clazz) {
        return applicationContext.getBeansOfType(clazz);
    }
}
@Component
public class Client<T> implements InitializingBean {

    @Autowired
    private ApplicationContextHelper applicationContextHelper;

/**
* 负责存储所有处理器
**/
private Map<String, Handle> handleMap = new ConcurrentHashMap<>(); @Override public void afterPropertiesSet() throws Exception { Map<String, Handle> handles = applicationContextHelper.getBeansOfType(Handle.class); for (Map.Entry<String, Handle> m : handles.entrySet()) { handleMap.put(m.getValue().getType().getType(), m.getValue()); } System.out.println(); } /**
* 关键的方法,根据类型获得处理器,执行对应的process方法
*/
public void doHandler(String tag, T t) { handleMap.get(tag).process(t); } }

 

public void strategyModel(Client client) {

        StatementDto dto1 = new StatementDto();
        dto1.setType("AHandler");
        client.doHandler(TypeEnums.TYPEA.getType(), dto1);

        StatementDto dto2 = new StatementDto();
        dto2.setType("BHandler");
        client.doHandler(TypeEnums.TYPEB.getType(), dto2);
    }
//运行结果:

AHandler
BHandler

 

策略模式的好处在于如果需求出现变化,如新增任务类型,则添加一个类去实现Handle接口,实现对应的process方法即可,不需要修改原方法

 

初识策略模式

标签:返回   erp   mod   任务   div   需要   one   bean   proc   

原文地址:https://www.cnblogs.com/liushengyuan/p/11779132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!