策略设计模式(Strategy)

Posted by 余腾 on 2019-08-15
Estimated Reading Time 3 Minutes
Words 938 In Total
Viewed Times

什么是策略设计模式?

策略设计模式 —> 行为型模式

策略模式定义了一系列的算法并将每一个算法封装起来,而且使它们还可以相互替换,让算法独立于使用它的客户而独立变化。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。

策略模式的意义:
1、策略模式使开发人员能够开发出由许多可替换的部分组成的软件,各部分之间是低耦合的关系。
2、低耦合的特性使软件具有更强的可扩展性,易于维护;更重要的是,它提高了软件的可重用性。

优、缺点
优点:可以动态的改变对象的行为。
缺点: 客户端必须知道所有的策略类,并自行决定使用哪个策略类。策略模式将产生很多策略类。


策略模式中有三个对象

(1)、环境对象(Context): 该类中实现了对抽象策略中定义的接口或者抽象类的引用。
(2)、抽象策略对象(Strategy): 它可由接口或抽象类来实现。
(3)、具体策略对象(ConcreteStrategy): 它封装了实现同不功能的不同算法。


策略模式的实现

1、对策略对象定义一个公共接口。
2、编写策略类,该类实现了上面的公共接口。
3、在使用策略对象的类中保存一个对策略对象的引用。
4、在使用策略对象的类中,实现对策略对象的set和get方法或者使用构造方法完成赋值。



1、定义一个接口( 抽象策略)

定义一个方法用于对两个整数进行运算

1
2
3
public interface Strategy {
public abstract int calculate(int a, int b);
}

2、定义具体的算法类

实现两个整数的加减乘除运算,但是外部调用形式需要符合接口的定义。

加法运算 实现公共接口

1
2
3
4
5
6
public class AddStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a + b;
}
}

减法运算 实现公共接口

1
2
3
4
5
6
public class SubstractStrategy implements Strategy {
@Override
public int calculate(int a, int b) {
return a - b;
}
}

乘法运算 实现公共接口

1
2
3
4
5
6
public class MultiplyStrategy 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 DivisionStrategy  implements Strategy{
@Override
public int calculate(int a, int b) {
if(b!=0){
return a/b;
}
else {
throw new RuntimeException("除数不能为零");
}
}
}

3、定义具体的环境角色

持有接口的引用,并且有get和set方法可以完成策略更换。在环境角色中调用接口的方法完成动作。

聚合模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Context {

private Strategy strategy;//聚合模式

public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int calculate(int a,int b){
return strategy.calculate(a, b);
}
}

4、客户端在调用

只需向环境角色设置相应的算法类,然后就可以得到相应的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class StrategyTest {
public static void main(String[] args) {
//加法
Context context=new Context(new AddStrategy());
System.out.println(context.calculate(10, 5));
//减法
Context context2=new Context(new SubstractStrategy());
System.out.println(context2.calculate(3, 2));
//乘法
Context context3=new Context(new MultiplyStrategy());
System.out.println(context3.calculate(6, 8));
//除法
Context context4=new Context(new DivisionStrategy());
System.out.println(context4.calculate(90, 9));
}
}

JDK 中策略模式的应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Arrays.sort();

public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}

public interface Comparator<T> {//策略接口

感谢阅读


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !