设计模式--策略

设计模式–策略

概念

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变换。

使用场景

  • 针对一类问题的多种处理方式,仅仅是具体行为有差别时。
  • 需要安全的封装多种同一类型的操作时。
  • 出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时。

UML结构图分析

  • Context:用来操作策略的上下文环境;
  • Stragety:策略的对象;
  • ConcreteStragetyA、ConcreteStragetyB:具体的策略实现

##实际代码分析

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// 策略接口
public interface Strategy {
void algorithm();
}


//具体实现 A
public class ConcreteStragetyA implements Strategy {

@Override
public void algorithm() {
System.out.println("ConcreteStragetyA");
}
}


//具体实现 B
public class ConcreteStragetyB implements Strategy {

@Override
public void algorithm() {
System.out.println("ConcreteStragetyB");
}
}


public class Context {

private Strategy mStragety;

//执行方法,调用具体策略对象
public void algorithm(){
mStragety.algorithm();
}

//初始化具体策略对象
public void setStragety(Strategy stragety) {
this.mStragety = stragety;
}
}


public class Client {

public static void main(String arg[]){
Context context = new Context();
context.setStragety(new ConcreteStragetyA());
context.algorithm();
}
}

##策略模式优点

  • 可以避免使用多重条件(if-else)语句,多重语句是代码不容易维护
  • 更好的拓展性,在策略模式中拓展新的策略实现非常容易,只要增加新的策略类,然后在选择使用策略的地方选择使用这个新的策略实现就好了。

##策略模式缺点

  • 增加了对象数,由于策略模式把每个具体的策略都单独封装成为类,如果备选策略很多的话,你们对象数就会很多
  • 只适合扁平的算法结构,每个策略的算法地位是平等的,这样在运行时刻只有一个算法被执行,限制了算法使用的层级,使用的时候不能被嵌套使用