Java设计模式之策略模式

首先定义一个策略接口

  1. public interface IStrategy {
  2. //定义具体策略必须具有的方法
  3. public void doSomething();
  4. }

定义子类实现接口

  1. public class ConcreteStrategy1 implements IStrategy{
  2. public void doSomething(){
  3. System.out.println("this is a concreteStrategy");
  4. }
  5. }
  1. public class ConcreteStrategy2 implements IStrategy{
  2. @Override
  3. public void doSomething() {
  4. System.out.println("This is concreteStrategy2");
  5. }
  6. }

定义全局上下文

  1. public class Context {
  2. private IStrategy strategy;
  3. public Context(IStrategy strategy){
  4. this.strategy = strategy;
  5. }
  6. public void doSomething(){
  7. this.strategy.doSomething();
  8. }
  9. }

定义一个枚举类

  1. public enum StrategyMan {
  2. Strategy1("com.strategy.ConcreteStrategy1"),
  3. Strategy2("com.strategy.ConcreteStrategy2");
  4. String value = "";
  5. private StrategyMan(String value){
  6. this.value = value;
  7. }
  8. public String getValue(){
  9. return this.value;
  10. }
  11. }

定义一个策略工厂

public class StrategyFactory {
    public static IStrategy getStrategy(StrategyMan strategyman){
        IStrategy strategy = null;
        try {
            strategy = (IStrategy) Class.forName(strategyman.getValue()).newInstance();
        } catch (Exception) {
            e.printStackTrace();
        }
        return strategy;
    }
}
public class StrategyFacade {
    public void doSomething(String str){
        StrategyMan sMan = StrategyMan.valueOf(str);
        IStrategy strategy = StrategyFactory.getStrategy(sMan);
        Context context = new Context(strategy);
        context.doSomething();
    }
}
public class Client {

    public static void main(String[] args) {
        StrategyFacade sFacade = new StrategyFacade();
        sFacade.doSomething("Strategy1");
    }
}

总结:

  • 首先定义一个策略接口;
  • 然后让一些子类实现这个接口,每一种策略就是一个子类;
  • 然后再定义一个枚举类来创建所需要的子类,再通过工厂的方式来生产策略类。