一起来学习设计模式:策略模式

1.策略模式概念

我们知道如果想在改变一个对象的状态的话,用的是观察者模式;而我们如果想要改变一个类的行为或者其算法的时候,就需要用到策略模式。如果想间接修改的话,当然不能直接在我们的本来的类上进行修改,而是创建一个专门执行算法的类,对外使用,我们想修改的时候直接修改这个对外的类就好了

  • 解决的问题:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
  • 如何解决:将这些算法封装一个个类,任意替换
  • 关键代码:我们要替换的话,实现同一个接口,利用面向对象多态的特征就可以随意地更换
  • 优点:
    算法可以随意切换;
    减少多重条件判断
    扩展性好
    缺点:策略类会增多(貌似也不是什么缺点。在平时的编码中注意规范和管理,感觉还是可以接受的)
  • 使用场景
    1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
    2、一个系统需要动态地在几种算法中选择一种。
    3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
  • 注意:如果一个系统的策略多于4个,就需要考虑使用混合模式

2.实现

我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。


一起来学习设计模式:策略模式_第1张图片
image.png

step1:

/**
 *
 * 功能描述: 
 * 定义一个策略接口
 * @auther: lanyangjia
 * @date: 2018/10/22 22:53
 */
public interface Strategy {
    public int doOperation(int num1, int num2);
}

实现这个接口,下面用两个实例测试一下

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

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

step2:

使用策略类的类

/**
 *
 * 功能描述: 
 * 使用策略的具体类
 * @auther: lanyangjia
 * @date: 2018/10/22 22:53
 */
public class Context {
    private Strategy strategy;
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

step3:

测试程序:

public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
        context = new Context(new OperationSubstract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

    }
}

一起来学习设计模式:策略模式_第2张图片
image.png

总结:
在看完策略模式以后,觉得这真是个好东西,可以随意地切换算法的实现;省去了一段的if..else试想。如果我们要用if...else的话我们需要判断传进来的是什么方法,然后再去决定调用哪一个方法。这样如果方法越来越多的话,可阅读性差,也不方便维护!这真的是个好东西!
来源:
http://www.runoob.com/design-pattern/strategy-pattern.html

你可能感兴趣的:(一起来学习设计模式:策略模式)