1.策略模式(Strategy Pattern)
分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。
2.实现方式
各个类的作用
AlgorithmStrategy
:创建一个定义活动的 AlgorithmStrategy接口
* OperationImpl
:实现了 AlgorithmStrategy接口的实体策略类
Context
:使用该策略的类
AlgorithmStrategyPattern
:验证策略改变时的行为
3.实例
创建一个接口
- AlgorithmStrategy .java
package com.huan.eu;
public interface AlgorithmStrategy {
int operation(int firstNumber,int SecondNumber);
}
创建策略一
- AddOperationImpl .java
package com.huan.eu.impl;
import com.huan.eu.AlgorithmStrategy;
public class AddOperationImpl implements AlgorithmStrategy {
public int operation(int firstNumber, int SecondNumber) {
return firstNumber + SecondNumber;
}
}
创建策略二
- ReduceOperationImpl .java
package com.huan.eu.impl;
import com.huan.eu.AlgorithmStrategy;
public class ReduceOperationImpl implements AlgorithmStrategy {
public int operation(int firstNumber, int SecondNumber) {
return firstNumber - SecondNumber;
}
}
创建策略三
- RideOperationImpl .java
package com.huan.eu.impl;
import com.huan.eu.AlgorithmStrategy;
public class RideOperationImpl implements AlgorithmStrategy{
public int operation(int firstNumber, int SecondNumber) {
return firstNumber * SecondNumber;
}
}
使用策略的类
- Context .java
package com.huan.eu;
public class Context {
private AlgorithmStrategy algorithmStrategy;
public Context(AlgorithmStrategy algorithmStrategy){
this.algorithmStrategy = algorithmStrategy;
}
public int executeAlgorithmStrategy(int firstNumber, int secondNumber){
return algorithmStrategy.operation(firstNumber,secondNumber);
}
}
使用不同策略时时的行为变化
- AlgorithmStrategyPattern.java
package com.huan.eu;
import com.huan.eu.impl.AddOperationImpl;
import com.huan.eu.impl.ReduceOperationImpl;
import com.huan.eu.impl.RideOperationImpl;
import org.junit.Test;
public class AlgorithmStrategyPattern {
@Test
public void test() {
Context context;
context = new Context(new AddOperationImpl());
System.out.println("10 + 50 =" + context.executeAlgorithmStrategy(10, 50));
context = new Context(new ReduceOperationImpl());
System.out.println("50 - 10 =" + context.executeAlgorithmStrategy(50, 10));
context = new Context(new RideOperationImpl());
System.out.println("10 * 50 =" + context.executeAlgorithmStrategy(10, 50));
}
}
4.总结
- 优点:
1、算法可以自由切换。
2、避免使用多重条件判断。
3、扩展性良好。- 缺点:
1、策略类会增多。
2、所有策略类都需要对外暴露。- 使用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。