项目中的一个页面跳转功能存在10个以上的if else判断,想要做一下整改 

目录

一、什么是策略模式

二、策略模式优缺点

优点:

缺点:

三、枚举+工厂方法实现策略模式code

1.定义共同行为接口

2.具体策略实现类

3.定义枚举,保存策略实现类具体路径

4.策略工厂

5.使用策略工厂获取具体策略实现

一、什么是策略模式

策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决多重If判断问题。

1.环境(Context)角色:持有一个Strategy的引用。

2.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

3.具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

(定义策略接口→实现不同的策略类→利用多态或其他方式调用策略。)

二、策略模式优缺点

优点:

算法可以自由切换(高层屏蔽算法,角色自由切换)

避免使用多重条件判断(如果算法过多就会出现很多相同的判断,很难维护)

扩展性好(可自由添加取消算法,而不影响整个功能)

缺点:

策略数量增多(每一个策略类复用性小,如果需要增加算法,就只能新增类)

所有的策略类都需要对外暴露(使用的人必须了解使用策略,这个就需要其他模式来补充,比如工厂模式、代理模式)

三、枚举+工厂方法实现策略模式code

1.定义共同行为接口

/**
 * 共同行为
 */
public interface FactApplyStrategy {

    String toAddFact();
}

2.具体策略实现类

package com.google.DesignPatterns.StrategyPattern.fact.impl;

import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy;

/**
 * @author wk
 * @Description:
 * @date 2019/12/24 13:59
 **/
public class GdFactApplyStrategy implements FactApplyStrategy {

    @Override
    public String toAddFact() {
        return "跳转光大银行";
    }
}
package com.google.DesignPatterns.StrategyPattern.fact.impl;

import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy;

/**
 * @author wk
 * @Description:
 * @date 2019/12/26 14:51
 **/
public class JTFactApplyStrategy implements FactApplyStrategy {

    @Override
    public String toAddFact() {
            return "跳转交通银行";
    }
}

3.定义枚举,保存策略实现类具体路径

package com.google.DesignPatterns.StrategyPattern.fact;

/**
 * 策略枚举类
 */
public enum PurposeEnum {

    TYPE_1(1, "中国银行", ""),

    TYPE_2(2, "光大银行", "com.google.DesignPatterns.StrategyPattern.fact.impl.GdFactApplyStrategy"),

    TYPE_3(3, "交通银行", "com.google.DesignPatterns.StrategyPattern.fact.impl.JTFactApplyStrategy"),
    ;

    private Integer code;
    private String mark;
    private String className;

    private PurposeEnum(Integer code, String mark, String className) {
        this.code = code;
        this.mark = mark;
        this.className = className;
    }

    public Integer getCode() {
        return code;
    }

    public String getMark() {
        return mark;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public static PurposeEnum getEnumObjByCode(Integer code) {
        for (PurposeEnum be : values()) {
            if (be.getCode().equals(code)) {
                return be;
            }
        }
        return null;
    }
}

4.策略工厂

package com.google.DesignPatterns.StrategyPattern.fact.factory;

import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy;
import com.google.DesignPatterns.StrategyPattern.fact.PurposeEnum;

/**
 * @author wk
 * @Description:
 * @date 2019/12/24 14:09
 **/
public class FactApplyFactory {

    //使用策略工厂获取具体策略实现
    public static FactApplyStrategy getFactApplyStrategy(Integer code) {
        try {
            return (FactApplyStrategy) Class.forName(PurposeEnum.getEnumObjByCode(code).getClassName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}

5.使用策略工厂获取具体策略实现

package com.google.DesignPatterns.StrategyPattern.fact.context;

import com.google.DesignPatterns.StrategyPattern.fact.FactApplyStrategy;
import com.google.DesignPatterns.StrategyPattern.fact.factory.FactApplyFactory;

/**
 * @author wk
 * @Description:获取具体策略实现
 * @date 2019/12/24 14:03
 **/
public class FactContextStrategy {

    /**
     * 获取具体的策略实现
     * @param code
     * @return
     */
    public String toAddFact(Integer code) {
        //使用策略工厂获取具体的策略实现
        FactApplyStrategy factApplyStrategy = FactApplyFactory.getFactApplyStrategy(code);
        if (factApplyStrategy == null) {
            throw new RuntimeException("没有找到对应的策略实现");
        }
        return factApplyStrategy.toAddFact();
    }

    public static void main(String[] args) {
        System.out.println(new FactContextStrategy().toAddFact(2));
        System.out.println(new FactContextStrategy().toAddFact(3));
    }

}

输出:

跳转光大银行
跳转交通银行