策略设计模式主要是为了减少代码冗余度,通常通过某个方法来决定使用哪个策略类,避免了大量的if - else或者switch,这里我们使用独特的反射➕枚举的方式来简单实现一下
- 1、创建父接口,声明要实现的方法
/**
* 父接口
* */
public interface StrategyFather {
void MyDad();
}
- 2、创建两个策略类,实现该接口方法,输出两个不同的内容
- 策略1 类
/**
*策略类1
*/
public class Strategyone implements StrategyFather{
@Override
public void MyDad() {
System.out.println("我是策略1");
}
}
- 策略2类
/**
*策略类2
*/
public class Strategytwo implements StrategyFather{
@Override
public void MyDad() {
System.out.println("我是策略2");
}
}
- 创建枚举类,声明自己的策略实现类的路径,方便反射获取对应的方法
/**
* 策略枚举类(重点)
*/
public enum Strategyenum {
//手动指定对应策略实现的方法路径,方便反射来直接获取
STRATEGYONE("com.example.strategy.Strategyone"),
STRATEGYTWO("com.example.strategy.Strategytwo");
private String className;
/**
* 构造方法,封装类名
* */
StrategyStatus(String className) {
this.setClassName(className);
}
public void setClassName(String className)
{
this.className = className;
}
public String getClassName()
{
return className;
}
}
- 声明一个获取策略实例的静态工具方法
/**
* 获取策略最终实现类的方法
*/
public class StrategyUtil {
public static StrategyFather getStrategy(String strategyType) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//获取枚举类中相应的类
String className = StrategyStatus.valueOf(strategyType).getClassName();
//反射获取策略实现的实例
return (StrategyFather) Class.forName(className).newInstance();
}
}
- 测试
@Test
public void test() throws Exception {
//放入在枚举定义好的需要的策略
StrategyFather Strategy1 = StrategyFactory.getStrategy("STRATEGYONE");
//拿到对应的策略
Strategy1.MyDad();
//以此类推
StrategyFather Strategy2 = StrategyFactory.getStrategy("STRATEGYTWO");
Strategy2.MyDad();
}
- 输出结果
后续可以自己再扩展,根据自己的业务场景来使用