相同点:同为行为型策略模式,均通过context类封装一个具体行为,都提供一个封装的方法;
不同点:
1)从定义看:目的不同
策略模式:封装不同的算法,算法间没有交互,达到算法可以自由互换目的; 实际样例:人生不同阶段的主要工作:儿童-》玩耍、成年-》工作。比如加密算法的互换(AES->RSA)
状态模式:封装不同的状态,达到状态切换后行为随之发生改变的目的。 实际样例:从儿童 切换 成年,因为状态的变化(儿童到成年),主要工作内容发生了改变。
2)具体场景代码比对
场景:人生不同阶段的主要工作:儿童-》玩耍、成年-》工作
策略模式代码:
1 public abstract class WorkAlgorithm {
2 public abstract void work();
3 }
4
5 // 策略1定义
6 public class ChildWork extends WorkAlgorithm {
7 @override
8 public void work(){
9 System.out.println("Child Work -> Play");
10 }
11 }
12 // 策略2定义
13 public class AdultWork extends WorkAlgorithm {
14 @override
15 public void work(){
16 System.out.println("Adult Work -> Work");
17 }
18 }
19
20 // 通过context绑定具体策略,并提供调用具体策略执行的方法
21 public class Context {
22 private WorkAlgorithm workMethod;
23
24 public void setWork(WorkAlgorithm work) {
25 this.workMethod = work;
26 }
27
28 public WorkAlgorithm getWork() {
29 return workMethod;
30 }
31
32 public void work() {
33 workMethod.work();
34 }
35 }
36
37 // 通过context动态绑定不同的策略,实现策略灵活更换的效果
38 public class Client {
39 public static void main(String[] args) {
40
41 Context context = new Context();
42
43 // 指定策略1
44 context.setWork(new ChildWork());
45 System.out.println("==== Child work ===");
46 context.work();
47
48 // 指定策略2
49 context.setWork(new AdultWork());
50 System.out.println("==== Adult work ===");
51 context.work();
52 }
53 }
知识兔