【设计模式】策略模式 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 }

原文地址:https://www.cnblogs.com/clarino/p/11695214.html

时间: 2024-10-09 15:28:07

【设计模式】策略模式 vs 状态模式的相关文章

【设计模式】 模式PK:策略模式VS状态模式

1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式.但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的:而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的.这两种模式虽然都有变换的行为,但

设计模式之策略模式和状态模式(strategy pattern & state pattern)

本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过对比和实例介绍,相信应该会一些比较深刻的感知.最后在结合个人的体会简单聊一下对这两个模式的一些看法. 1. 模式概念 1.1 策略模式 运行时更改类的行为或算法,从而达到修改其功能的目的: 使用场景: 一个系统需要动态地在几种算法中选择一种,而这些算法之间仅仅是他们的行为不同. 此外决策过程中过多的

设计模式(10)--状态模式

组合 .委托 基本常识:策略模式和状态模式是双胞胎,在出生时才分开. 一般来说,我们把策略模式想成是除了继承之外的一种弹性替代方案. 什么时候用接口? or 抽象类? 当实现接口的类中,重复代码太多时,可考虑继承 . OO模式: 状态模式--允许对象在内部状态改变时改变它的作为,对象看起来好像修改了它的类 如:  因为一个状态对应一个类, 每个类中的方法名相同,但实现不同. 所以看起来好像修改了类. 例: 饮料机(DrinkMachine)的状态 如果对对象的状态建模 -- 通过创建一个实例变量

设计模式(行为型)之状态模式(State Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之模板方法模式(Template Method Pattern)>http://blog.csdn.net/yanbober/article/details/45501715 概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中

职责链模式vs状态模式区别

状态模式在具体状态里设置了下一状态. 而职责链模式是在客户端代码里设置了下一状态的处理对象. 如果状态模式里的任何一环缺失,将导致事情无法进行下去.职责链模式的链式在客户端连接的,也就是说,如果我们请假,请假制度一旦改变,比如说我们不需要班长,或者是先请求老师后直接请求主任或者中间多了一个环节,都是很容易实现的,所以,职责链模式要比状态模式灵活很多. 小时候写日记都是这么写的:上午七点起床,八点之前洗脸刷牙吃早饭,十二点之前好好上课,中午一点,吃午饭,下午两点到六点,上课,下课,找请假,明天妈妈

23行为型模式之状态模式

概念 State模式也叫状态模式,是行为设计模式的一种.State模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转译到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化. 角色和职责 Context:用户对象 拥有一个State类型的成员,以标识对象的当前状态: State:接口或基类 封装与Context的特定状态相关的行为: ConcreteState:接口实现

行为型模式之状态模式

概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题.当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式.状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状态,无论对于何种状态的对象,客户端都可以一致处理. 定义 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类

设计模式(java)--状态模式

状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 意图:允许一个对象在其内部状态改变时改变它的行为 适用场景: 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分

设计模式21:State 状态模式(行为型模式)

State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合? 意图(Intent) 允许一个对象在其内部状态改变时改变它的行为.从而使对象看起来似乎修改了其行为.——<设计模式>GoF 结构(Structure) 示例代码 public enum Document