设计模式-策略设计模式(反射+枚举+策略)

59 阅读1分钟

策略设计模式主要是为了减少代码冗余度,通常通过某个方法来决定使用哪个策略类,避免了大量的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();

    }

输出: 在这里插入图片描述