策略模式使用

1. 是什么

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
1. 抽象策略角色 - 接口或者抽象类
2. 具体策略角色
3. 环境角色 - 持有策略类的引用,最终给客户端调用

2. 代码编写

抽象策略角色

1
2
3
public interface Cal {
int calate(int a,int b);
}

具体策略角色

1
2
3
4
5
6
7
8
9
10
11
12
13
public class AddCal implements Cal {
@Override
public int calate(int a, int b) {
return a + b;
}

}
public class SubCal implements Cal {
@Override
public int calate(int a, int b) {
return a - b;
}
}

环境类

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


Cal cal = null;

public Environment(Cal cal) {
this.cal = cal;
}

public int invokeCal(int a , int b) {
return cal.calate(a,b);
}



public void setCal(Cal cal) {
this.cal = cal;
}
}

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class StrategyTest {

public static void main(String[] args) {

AddCal cal = new AddCal();

Environment environment = new Environment(cal);


environment.setCal(cal);


int i = environment.invokeCal(1, 2);

System.out.println(i);

environment.setCal(new SubCal());

System.out.println(environment.invokeCal(1,2));


}


}

输出:

3
-1

3. 优缺点

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。3. 客户端必须要知道所有的实现类

注意事项:
如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。