【设计模式】策略模式 vs 状态模式

相同点:同为行为型策略模式,均通过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 }
知识兔
计算机