行为型-策略模式

189 阅读1分钟

1.什么是策略模式

策略是一种行为设计模式, 它将一组行为转换为对象, 并使其在原始上下文对象内部能够相互替换。

image.png

2.案例

2.1 上下文

Context.java

/**
 * com.example.design.behavior.strategy
 * Description:
 * 上下文
 *
 * @author jack
 * @date 2021/6/2 3:54 下午
 */
public class Context {

    /**
     * 上下文会维护指向某个策略对象的引用。上下文不知晓策略的具体类。上下文必须通过策略接口来与所有策略进行交互。
     */
    private final Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b) {
        return strategy.execute(a, b);
    }
}

2.2 抽象策略

Strategy.java

/**
 * com.example.design.behavior.strategy
 * Description:
 * 抽象策略
 *
 * @author jack
 * @date 2021/6/2 3:51 下午
 */
public interface Strategy {

    /**
     * 计算
     *
     * @param a a
     * @param b b
     * @return result
     */
    int execute(int a, int b);

}

2.3 具体策略

ConcreteStrategyAdd.java

/**
 * com.example.design.behavior.strategy
 * Description:
 * 具体策略
 *
 * @author jack
 * @date 2021/6/2 3:52 下午
 */
public class ConcreteStrategyAdd implements Strategy {

    @Override
    public int execute(int a, int b) {
        return a + b;
    }
}

ConcreteStrategyMultiply.java

/**
 * com.example.design.behavior.strategy
 * Description:
 * 具体策略
 *
 * @author jack
 * @date 2021/6/2 3:53 下午
 */
public class ConcreteStrategyMultiply implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a * b;
    }
}

ConcreteStrategySubtract.java

/**
 * com.example.design.behavior.strategy
 * Description:
 * 具体策略
 *
 * @author jack
 * @date 2021/6/2 3:53 下午
 */
public class ConcreteStrategySubtract implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a - b;
    }
}

3.客户端

/**
 * com.example.design.behavior.strategy
 * Description:
 *
 * @author jack
 * @date 2021/6/2 3:58 下午
 */
public class Client {
    public static void main(String[] args) {
        Context context = null;
        int type = 2;
        if (type == 1) {
            context = new Context(new ConcreteStrategyAdd());
        } else if (type == 2) {
            context = new Context(new ConcreteStrategySubtract());
        } else if (type == 3) {
            context = new Context(new ConcreteStrategyMultiply());
        }
        System.out.println(context.executeStrategy(1, 10));
    }
}

借鉴:refactoringguru.cn/design-patt…