项目中的一个页面跳转功能存在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));
}
}
输出:
跳转光大银行
跳转交通银行