策略设计模式主要是为了减少代码冗余度,通常通过某个方法来决定使用哪个策略类,避免了大量的if else或者switch
1、创建父接口,声明要实现的方法
/**
* 策略父接口
* */
public interface StrategyFather {
void say();
}
二、创建策略类,实现该方法,一个中文输出一个英文输出 1、中文输出
/**
* @author cy
* @version 1.0
* @date 2021/9/16 13:31
* 中文输出
*/
public class ChineseSay implements StrategyFather{
@Override
public void say() {
System.out.println("你好男孩");
}
}
2、英文输出
/**
* @author cy
* @version 1.0
* @date 2021/9/16 13:32
* 英文输出
*/
public class EnglishSay implements StrategyFather{
@Override
public void say() {
System.out.println("hello boy");
}
}
三、创建枚举类声明其类名
/**
* @author cy
* @version 1.0
* @date 2021/9/16 13:25
* 策略枚举类
*/
public enum StrategyStatus {
ENGLISH("com.example.demotest.EnglishSay"),
CHINESE("com.example.demotest.ChineseSay");
private String className;
/**
* 构造方法,封装类名
* */
StrategyStatus(String className) {
this.setClassName(className);
}
public void setClassName(String className)
{
this.className = className;
}
public String getClassName()
{
return className;
}
}
四、声明一个获取策略实例的静态方法
/**
* @author cy
* @version 1.0
* @date 2021/9/16 13:23
* 获取策略最终实现类的方法
*/
public class StrategyFactory {
public static StrategyFather getStrategy(String strategyType) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//获取枚举类中相应的类
String className = StrategyStatus.valueOf(strategyType).getClassName();
//反射获取实例
return (StrategyFather) Class.forName(className).newInstance();
}
}
五、测试
public static void main(String[] args) throws Exception {
StrategyFather english = StrategyFactory.getStrategy("ENGLISH");
english.say();
StrategyFather chinese = StrategyFactory.getStrategy("CHINESE");
chinese.say();
}
输出: