设计模式相关文章,用于整理网络中对应的设计模式的一些解读。

策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

实例

以下实例来源于微信公众号(Java知音)文章,设计模式是什么鬼(策略)

计算器

实现一个最简单的计算器,假设只能进行加减法,代码如下:

1
2
3
4
5
6
7
8
9
public class Calculator {//违反设计模式原则的做法
public int add(int a, int b){//加法
return a + b;
}

public int sub(int a, int b){//减法
return a - b;
}
}

这样写能实现我们的加减法功能,但是往拓展方面想,如果随着我们的算法不断增加,如乘法、除法、次方、开方等等,那么这个计算器类就得不断的改啊改啊,改到最后这个类的代码将会非常庞大。。

抽象

既然不能把算法给写死在这里面,那一定要把这个算法给抽象一下,把实现细节从这个类里抽离出来,独立出来成为n个策略,就当下来讲我们一共有俩个策略,一个是加法策略,一个是减法策略,他们实现的都是同一个算法接口,接收参数为操作数a,以及被操作数b。

1
2
3
public interface Strategy {//算法标准
public int calculate(int a, int b);//操作数,被操作数
}

实现

加法

1
2
3
4
5
6
7
8
public class Addition implements Strategy{//实现算法接口

@Override
public int calculate(int a, int b) {//加数与被加数
return a + b;//这里我们做加法运算
}

}

减法

1
2
3
4
5
6
7
8
public class Subtraction implements Strategy{//实现算法接口

@Override
public int calculate(int a, int b) {//减数与被减数
return a - b;//这里我们做减法运算
}

}

实现计算器

1
2
3
4
5
6
7
8
9
10
11
public class Calculator {//计算器类
private Strategy strategy;//拥有某种算法策略

public void setStrategy(Strategy strategy) {//接入算法策略
this.strategy = strategy;
}

public int getResult(int a, int b){
return this.strategy.calculate(a, b);//返回具体策略的结果
}
}

可以看到,计算器类里已经把之前的具体加减算法实现代码给剥离出去了,要用哪个算法,只需要注入进来,然后获得计算结果getResult实际上调用的是具体算法的calculate。

使用计算器

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {
public static void main(String[] args) {
Calculator calculator = new Calculator();//实例化计算器
calculator.setStrategy(new Addition());//接入加法实现
int result = calculator.getResult(1, 1);//计算!
System.out.println(result);//得到的是加法结果2

calculator.setStrategy(new Subtraction());//再次接入减法实现
result = calculator.getResult(1, 1);//计算!
System.out.println(result);//得到的是减法结果0

}
}

这个计算器可以说是具有算法策略扩展性的,以后要有新的算法是不需要再更改任何现有代码的,只需要新写一个算法比如乘法Multiplication,并实现calculate方法,接下来要做的只是组装上去便可以使用了。

总结

策略实现类已经成为独立于宿主之外的模块,即插即用。可以组合成为一个整体,又可以分拆独立,可以发生关联,但绝不耦合,既对立又统一,这是唯物辩证法的绝佳体现。