策略模式
策略模式定义
定义一系列的算法,把它们一个个封装起来,并且使他们可互相替换。本模式使得算法可独立与使用它的客户而变化。
有个管理类
策略模式使用场景
- 一个类定义了多种行为,并且这些行为在这个类的方法中以多个条件语句的形式出现,那么可以使用策略模式避免在类中使用大量的条件语句。
- 可用于替换繁杂的 if-else 判断语句
- Volley 中的 HttpStack 用的是策略
特点:
一堆的处理类, 虽然新增了很多类, 但是职责很明确, 基本符合对 修改关闭对扩展开放
的原则
策略模式&工厂消除 if else
消除前
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| @Test
public void testJump() {
jump("im");
jump("settings");
}
private void jump(String actionType) {
if (JUMP_IM.equals(actionType)) {
System.out.println("去小纸条");
} else if (JUMP_SETTINGS.equals(actionType)) {
System.out.println("去设置");
} else if (JUMP_CIRCLE_DETAIL.equals(actionType)) {
System.out.println("去糗友圈详情页");
} else if (JUMP_CIRCLE_FOLLOW.equals(actionType)) {
System.out.println("去糗友圈关注");
} else if (JUMP_CIRCLE_NEARBY.equals(actionType)) {
System.out.println("去糗友圈隔壁");
} else if (JUMP_CIRCLE_POST.equals(actionType)) {
System.out.println("去糗友圈发帖");
} else if (JUMP_CIRCLE_TOPIC.equals(actionType)) {
System.out.println("去糗友圈发帖");
}
}
|
消除后
1
2
3
4
5
6
7
8
| /**
* 策略
*/
interface AbsJumpStrategy {
boolean canHandle();
void jump();
}
|
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
26
27
28
29
30
| final class CircleDetailJumpStrategy implements AbsJumpStrategy {
@Override
public boolean canHandle() {
return true;
}
@Override
public void jump() {
System.out.println("jump settings");
}
}
final class ImJumpStrategy implements AbsJumpStrategy {
@Override
public boolean canHandle() {
return true;
}
@Override
public void jump() {
System.out.println("im jump");
}
}
final class SettingsJumpStrategy implements AbsJumpStrategy {
@Override
public boolean canHandle() {
return true;
}
@Override
public void jump() {
System.out.println("jump settings");
}
}
|
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
26
| final class StrategyFactory {
public static final String JUMP_IM = "im"; // IM标签
public static final String JUMP_SETTINGS = "settings"; // 设置
public static final String JUMP_CIRCLE_DETAIL = "circle_article_detail"; // 动态动态页
private static StrategyFactory factory = new StrategyFactory();
private static Map<String, AbsJumpStrategy> strategyMap = new HashMap<>();
private StrategyFactory() {
}
public static StrategyFactory getInstance() {
return factory;
}
public AbsJumpStrategy create(String type) {
return strategyMap.get(type);
}
static {
strategyMap.put(JUMP_IM, new ImJumpStrategy());
strategyMap.put(JUMP_SETTINGS, new SettingsJumpStrategy());
strategyMap.put(JUMP_CIRCLE_DETAIL, new CircleDetailJumpStrategy());
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| /**
* 策略上下文
*/
public class StrategyContext {
public static void jump(String type) {
AbsJumpStrategy strategy = StrategyFactory.getInstance()
.create(type);
if (strategy != null && strategy.canHandle()) {
strategy.jump();
} else {
System.err.println("没有找到具体的策略。。。:" + type);
}
}
}
|
1
2
3
4
5
| @Test
public void testJump2() {
String type = "im1";
StrategyContext.jump(type);
}
|