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

组合 、委托

基本常识:策略模式和状态模式是双胞胎,在出生时才分开。

一般来说,我们把策略模式想成是除了继承之外的一种弹性替代方案。

什么时候用接口? or 抽象类?

当实现接口的类中,重复代码太多时,可考虑继承 。

OO模式
状态模式--允许对象在内部状态改变时改变它的作为,对象看起来好像修改了它的类

如:  因为一个状态对应一个类, 每个类中的方法名相同,但实现不同。 所以看起来好像修改了类。

例:

饮料机(DrinkMachine)的状态

如果对对象的状态建模 -- 通过创建一个实例变量来持有状态值,并在方法内书写条件代码来处理不同状态。

状态:投币、出饮料、退币、售完饮料等

public class DrinkMachine{

final static int SOLD_OUT=0;  //卖出

final static int NO_QUARTER =1;   //没有25分钱

final static int HAS_QUARTER = 2;  //  有 25分钱

final staic int SOLD =3;

int state = SOLD_OUT ; // 初始状态饮料售罄

int count = 0;   //机器内 饮料数量

public  DrinkMachine(int count ){  //初始化饮料数量

this.count = count;

if(count <0){

state = NO_QUARTER;

}

}

public void insertQuarter(){  // 投币动作

if(state == HAS_QUARTER){}

else if( state ==NO_QUARTER){}                     //跟据当前不同的状态 , 做相应的事。

else if( state ==SOLD_OUT){}

}

// 退币动作

// 转动手柄 取饮料动作

// 出饮料动作

}       //

如果变更需求时 (如新加一个随机出两瓶饮料的动作),将 不容易 扩展。  需要修改类的方法 , 违返 设计原则 对修改关闭。

使用思虑周密的方法学构造的牢不可破的设计

新的设计:  组合  委托

将状态对象封装在各自的类中,然后在动作发生时委托给当前状态

(1)首先,我们定义一个State接口。在这个接口内,糖果机的每个动作都有一个对应的方法。

(2) 然后为机器中的每个状态实现状状类。这些类将负责在对应的状态下进行机器的行为。

(3)最后,我们要摆脱旧的条件代码,取而代之的方式是,将动作委托到状态类。

之前的 饮料机中每一个状态   对应 现在的一个状态类。

下面就是完成各种状态类。  implements State 如: 投币之后,应该做哪些事,机器到什么状态

一个类一个责任,莫要用一个类表示两个状态。

状态: 封装基于状态的行为,并将行为委托到当前状态。

策略:将可以互换的行为封装起来,然后使用委托的方法,决定使用哪一个行为。

模板方法:由子类决定如何实现算法中的某些步聚。

要点:

(1)状态模式允许一个对象基于内部状态而拥有不同的行为。

(2)和程序状态机(PSM)不同,状态模式用类代表状态。

(3)Context 会将行为委托给当前状态对象。

(4)通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了。

(5)状态模式和策略模式有相同的类图,但是它们的意思不同。

(6)策略模式通用会用行为或算法来配置Context类。

(7)状态模式允许Context随着状态的改变而改变行为。

(8)使用状态模式通常会导致设计中类的数目大量增加

(9)状态类可以被多个Context实例共享。

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

时间: 2024-11-06 18:55:01

设计模式(10)--状态模式的相关文章

Head First 设计模式 --10 状态模式

状态模式:允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类. 用到的设计原则1.封装变化2.多用组合,少用继承3.针对接口编程,不针对实现编程4.松耦合5.对扩展开放,对修改关闭6.依赖抽象,而不依赖具体7.只和朋友交谈8.别找我,我会找你9.类应该只有一个修改的理由 例子来自<Head First设计模式>,糖果机的例子 interface State { public void insertQuarter(); public void ejectQuarter(); pub

大话设计模式_状态模式(Java代码)

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 简单描述:一个Context类(存有一个抽象状态State引用),调用状态类的方法.State的具体类方法中会判断Context类的状态(如时间),满足一个状态则执行相应动作,否则把Context的State引用指向下一个状态类,由下一个状态类决定相应行为 大话设计模式中的截图: 例子代码: Work类(Context): 1 package com.longsheng.state; 2 3 public cla

设计模式之状态模式20170712

行为型设计模式之状态模式: 一.含义 为每个状态创建与之对应的类(对应的每个类实现同一个接口或继承同一个抽象类,便于统一处理),并且再通过一个类切换状态 二.代码说明 1.一般包含三个角色抽象状态角色,具体状态角色,以及环境(上下文)角色(负责具体状态的切换). 具体步骤: 1)定义环境角色,并初始化状态 2)通过环境角色执行行为,同时也就是对应状态的行为被执行 3)对应状态的行为的执行分为两种情况: I.对应状态对应行为执行后,环境角色继续执行行为,调用的还是此状态,此状态的下一个行为(下一状

设计模式之状态模式(State)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

软考总结— 设计模式之状态模式

软考在即,针对下午题的设计模式,本人有觉得有必要从考试战略上稍微做一些总结.为什么呢?一方面设计模式只要掌握好做题技巧,还是比较好拿分的.另一方面,通过这次软考又进一步的学习设计模式,而且在题目中给出的设计模式都是在项目中很好的应用. 一开始做题,没有全局观.俗话说的好"不谋全局者不足谋一域",不管做什么事,先在战略方向上把握好了,采取什么样的战术,都不成什么问题了.所以考试也是一样.下面这道题就很典型:   [题目] 某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,

设计模式之状态模式

<设计模式>对状态模式的定义:允许一个对象在其状态改变时,改变它的行为.看起来对象似乎修改了它的类.别名:状态对象(Objects for State). 在下面两种情况下均可以使用State模式: 1 一个对象的行为取决于它的状态,并且他必须在运行时刻根据状态改变它的行为. 2 一个操作中含有庞大的多分枝的条件语句,并且这些分支依赖于该对象的状态.这个状态通常用一个或多个枚举常量表示.通常,有多个操作包含这一相同的条件结构.State模式将每一个条件分支放入一个独立的类中.这是得你可以根据对

JAVA设计模式之 状态模式【State Pattern】

一.概述 当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式.状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化.状态模式是一种对象行为型模式. 二.适用场景 用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题.简单说就是处理对象的多种状态及其相互转换. 三.UML类图 四.参与者 1>.AbstractState(抽象状态类): 在抽象状态类中定义申明了不同状态下的行为抽象方法,而由子类

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

【设计模式】状态模式 改进后的

1.简单谈谈 状态模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类. 状态模式要解决的问题是:当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化. 优点:简化了一个对象的状态转换和行为改变的代码,把这部分代码放在了[状态类]中,需要注意的一点是:在[状态类]中,每个不同的[状态值]也许会被“串起来”成为一条链,这样就能保证设置不同的“离散的”[状态值]时,可以在“链上”有有个对应的处理(行为).

大话设计模式之----状态模式

<?php    #状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类.    //抽象状态    abstract class State{        public $w;        abstract function WriteProgram($w);    }        //上午和中午工作状态类    class ForenoonState extends State{        function WriteProgram($w){