前言
在给人介绍设计模式的时候,总是由于记忆不清楚导致效果不好。索性写文章记下来,正所谓好记性不如烂笔头,以后切记总结思考,不断进步。
开始
在策略模式中,一个类的行为或者算法可以在运行时候更改,这种类型的设计模式属于行为型模式。在策略模式中,我们创建各种策略对象和一个行为随着
策略对象改变而改变的context对象,策略对象改变context对象的执行算法。
意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
解决: 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
优点: 算法可以自由的切换,避免使用多重的if/else判断,扩展性良好。
缺点: 策略类会增多,并且策略类要对外暴露方法。
使用场景:1.如果在一个系统里面有许多类,他们的区别仅在于他们的行为,那么使用策略模式可以让一个对象在许多行为中选择一种行为;2.如果一个对象有很多行为,如果使用不当的设计模式,这些行为就只好使用多重的条件选择语句来实现。
实现
创建一个接口:
public interface Strategy {
int doOperation(int num1, int num2); }
创建实现接口的实现类1:
public class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}}
创建实现接口的实现类2:
public class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}}
创建context类:
public class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}}
使用 Context 来查看当它改变策略 Strategy 时的行为变化:
public class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
public static void main(String[] args) {
Context context = new Context();
context.setStrategy(new OperationAdd());
System.out.println(context.executeStrategy(1, 2)); //输出 3
context.setStrategy(new OperationMultiply());
System.out.println(context.executeStrategy(3, 4)); //输出12
}}
这就是策略模式的基本用法了,大胆的在项目中运用他吧!