文章

策略模式

策略模式

策略模式

策略模式定义

定义一系列的算法,把它们一个个封装起来,并且使他们可互相替换。本模式使得算法可独立与使用它的客户而变化。
有个管理类

策略模式使用场景

  • 一个类定义了多种行为,并且这些行为在这个类的方法中以多个条件语句的形式出现,那么可以使用策略模式避免在类中使用大量的条件语句。
  • 可用于替换繁杂的 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);
}
本文由作者按照 CC BY 4.0 进行授权