UML类图

图片说明

初步理解

有多种策略,原本是在一个类中用if else实现,现在每一种策略都封装到类中。主要为了解决在有多种算法相似的情况下,使用 if...else 会比较复杂以及难以维护。

代码理解

底层接口

public interface Strategy {
    public int operation(int num1, int num2);
}

多个策略封装成类(3个)

public class Add implements Strategy{
    @Override
    public int operation(int num1, int num2) {
        return num1 + num2;
    }
}

public class Subtract implements Strategy{
    @Override
    public int operation(int num1, int num2) {
        return num1 - num2;
    }
}

public class Multiply implements Strategy{
    @Override
    public int operation(int num1, int num2) {
        return num1 * num2;
    }
}

策略类

里面直接附带一个接口属性。初始化时,通过传入的对象(多态),了解应该调用哪种策略。

public class Context {
    private Strategy strategy;
    //构造函数
    public Context(Strategy strategy){
        this.strategy = strategy;
    }

    public int selcect(int num1, int num2){
        return strategy.operation(num1, num2);
    }
}

测试方法

public class Demo {
    public static void main(String[] args) {
        Context context = new Context(new Add());
        System.out.println("10 + 5 = " + context.selcect(10, 5));

        context = new Context(new Subtract());
        System.out.println("10 - 5 = " + context.selcect(10, 5));

        context = new Context(new Multiply());
        System.out.println("10 * 5 = " + context.selcect(10, 5));
    }
}

测试结果

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

总结

三个策略本来可以放在一个类中,用逻辑if else判断,但是为了后期方便维护,将策略封装成一个个的类,然后利用多态,去实现一个策略类的对象,可以根据传入的参数,选择对应的策略类对象,并调用对应的方法。