- 浏览: 83510 次
- 性别:
- 来自: 深圳
最新评论
-
月亮不懂夜的黑:
[color=orange][/color][/color][ ...
二叉树的深度优先和广度优先遍历 -
月亮不懂夜的黑:
<font color='re ...
二叉树的深度优先和广度优先遍历 -
zhufeng1981:
...
正在为理想而奋斗的程序员进来看看
状态模式要点:
1.状态模式允许一个对象基于内容状态而拥有不同的行为
2.和程序状态机不同,状态模型用类代表状态
3.Context会将行为委托给当前状态对象
4.通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了
5.状态模式和策略模式有相同的类图,但是它们的意图不同
6.策略模式通常会用行为或算法来配置Context类
7.状态模式允许Context随着状态的变化而改变行为
8.状态转换可以有State类或Context类控制
9.使用状态模式通常会导致设计中类的数量大量增加
10.状态类可以被多个Context实例共享
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改它的类。
何时用:
State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.
不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊性质的记录,这种属性的改变(切换)又是随时可能发生的,就有可能要使用State.
状态模式优点:
(1) 封装转换过程,也就是转换规则
(2) 枚举可能的状态,因此,需要事先确定状态种类。
状态模式实质:
使用状态模式前,客户端外界需要介入改变状态,而状态改变的实现是琐碎或复杂的。
使用状态模式后,客户端外界可以直接使用事件Event实现,根本不必关心该事件导致如何状态变化,这些是由状态机等内部实现。
状态模式的设计步骤:
1.首先,定义一个State接口。在这个接口内,每个动作都有一个对应的方法
2.然后为机器中的每个状态实现状态类。这些状态类将负责在对应的状态下进行机器的行为
3.最后,要摆脱旧的条件代码,取而代之的方式是,将动作委托到状态类
这里要阐述的是"开关切换状态" 和" 一般的状态判断"是有一些区别的, " 一般的状态判断"也是有 if..else if结构,例如:
if (which==1) state="hello";
else if (which==2) state="hi";
else if (which==3) state="bye";
这是一个 "一般的状态判断",state值的不同是根据which变量来决定的,which和state没有关系.如果改成:
if (state.euqals("bye")) state="hello";
else if (state.euqals("hello")) state="hi";
else if (state.euqals("hi")) state="bye";
这就是 "开关切换状态",是将state的状态从"hello"切换到"hi",再切换到""bye";在切换到"hello",好象一个旋转开关,这种状态改变就可以使用State模式了.
如果单纯有上面一种将"hello"-->"hi"-->"bye"-->"hello"这一个方向切换,也不一定需要使用State模式,因为State模式会建立很多子类,复杂化,但是如果又发生另外一个行为:将上面的切换方向反过来切换,或者需要任意切换,就需要State了.
请看下例:
public class Context{ private Color state=null; public void push(){ //如果当前red状态 就切换到blue if (state==Color.red) state=Color.blue; //如果当前blue状态 就切换到green else if (state==Color.blue) state=Color.green; //如果当前black状态 就切换到red else if (state==Color.black) state=Color.red; //如果当前green状态 就切换到black else if (state==Color.green) state=Color.black; Sample sample=new Sample(state); sample.operate(); } public void pull(){ //与push状态切换正好相反 if (state==Color.green) state=Color.blue; else if (state==Color.black) state=Color.green; else if (state==Color.blue) state=Color.red; else if (state==Color.red) state=Color.black; Sample2 sample2=new Sample2(state); sample2.operate(); } }
在上例中,我们有两个动作push推和pull拉,这两个开关动作,改变了Context颜色,至此,我们就需要使用State模式优化它。
另外注意:但就上例,state的变化,只是简单的颜色赋值,这个具体行为是很简单的,State适合巨大的具体行为,因此在,就本例,实际使用中也不一定非要使用State模式,这会增加子类的数目,简单的变复杂.
利用状态模式将上述代码修改:
State需要两种类型实体参与:
1.state manager 状态管理器 ,就是开关 ,如上面例子的Context实际就是一个state manager, 在state manager中有对状态的切换动作.
2.用抽象类或接口实现的父类,,不同状态就是继承这个父类的不同子类.
以上面的Context为例.我们要修改它,建立两个类型的实体.
第一步: 首先建立一个父类:
父类中的方法要对应state manager中的开关行为,在state manager中 本例就是Context中,有两个开关动作push推和pull拉.那么在状态父类中就要有具体处理这两个动作:handlepush() handlepull(); 同时还需要一个获取push或pull结果的方法getcolor() 下面是具体子类的实现: 同样 其他状态的子类实现如blue一样. 第二步: 要重新改写State manager 也就是本例的Context:public abstract class State{
public abstract void handlepush(Context c);
public abstract void handlepull(Context c);
public abstract void getcolor();
}
public class BlueState extends State{
public void handlepush(Context c){
//根据push方法"如果是blue状态的切换到green" ;
c.setState(new GreenState());
}
public void handlepull(Context c){
//根据pull方法"如果是blue状态的切换到red" ;
c.setState(new RedState());
}
public abstract void getcolor(){ return (Color.blue)}
}
public class Context{
private Sate state=null; //我们将原来的 Color state 改成了新建的State state;
//setState是用来改变state的状态 使用setState实现状态的切换
pulic void setState(State state){
this.state=state;
}
public void push(){
//状态的切换的细节部分,在本例中是颜色的变化,已经封装在子类的handlepush中实现,这里无需关心
state.handlepush(this);
//因为sample要使用state中的一个切换结果,使用getColor()
Sample sample=new Sample(state.getColor());
sample.operate();
}
public void pull(){
state.handlepull(this);
Sample2 sample2=new Sample2(state.getColor());
sample2.operate();
}
}
发表评论
-
不错的经典算法java和c两种实现(含代码图文解释)(转)
2010-03-05 20:55 1456通过Java C语言分别实现各种算法,图文并茂,描述很详细! ... -
MyEclipse配置Tomcat(图解)
2009-11-24 10:14 18751) 安装完MyEclipse 后 ... -
Apache的80端口被占用【文章教程】
2009-11-24 10:13 2758哎呀!~今天突然发现我的APMserv启动时发现Apache的 ... -
Spring学习笔记之bean和BeanFactory
2009-11-12 21:27 01.bean定义和bean实例化 bean ... -
Spring学习笔记之依赖注入(更新中)
2009-11-12 20:45 938Spring为企业应用开发提供一个轻量级的解决方案。该 ... -
65个源代码网站
2009-11-07 20:28 16161.51源码:http://www.51aspx.com/ ... -
归并排序
2009-10-21 10:50 765http://yuan.iteye.com/blog/3087 ... -
Swing编程总结
2009-09-04 19:49 0为了显示一个窗口,每 ... -
java 输入流与输出流相关知识
2009-09-04 10:31 2949流是生产或消费信息的一种抽象描述,通过java的输入 ... -
线程相关知识
2009-08-27 14:45 767进程本质上是一个执行的程序。每个进程都有自己独立的一块内存空间 ... -
head first 设计模式之观察者模式之总结
2009-08-10 12:32 1326观察者模式要点: 1.观察者模式定义了对象之间一对多的关系 ... -
国外开源软件网站-收
2009-08-08 08:02 1530sourceforge http://www.sourcefo ... -
JSP指令之page指令
2009-08-07 21:40 1583page指令用于为容器提供指示,这些指示将应用于当 ... -
JSP指令基础
2009-08-07 20:37 952JSP指令不是JSP代码中逻辑的一部分。相反,JS ... -
不错的设计模式学习网站
2009-08-07 08:55 753http://www.riabook.cn/doc/desig ... -
23种设计模式
2009-08-05 21:30 8861、工厂模式:客户类和 ... -
head first 设计模式之代理模式之总结
2009-08-05 15:32 0代理模式要点: ... -
head first 设计模式之策略模式之总结
2009-08-05 14:07 0策略模式的要点: 1、Strategy及其子类为组件提 ... -
开发人员一定要加入收藏夹的网站
2009-08-02 21:24 706http://www.gotapi.com/语言: ... -
Head First 设计模式之单件模式之总结
2009-08-02 15:40 1065单件模式要点: 1.单件模式确保程序中一个类最多只有 ...
相关推荐
《Head First 设计模式》与《Java设计模式(第2版)》是两本非常重要的IT书籍,专注于软件开发中的设计模式。设计模式是解决软件设计中常见问题的经验总结,它们提供了一种标准的方法来处理特定场景下的问题,使得代码...
笔记_HeadFirst设计模式
《Head First设计模式》是一本深受开发者喜爱的经典书籍,它以独特且易于理解的方式介绍了设计模式这一复杂的概念。设计模式是软件开发中的经验总结,是解决常见问题的有效模板,可以帮助我们编写更灵活、可维护和可...
《Headfirst设计模式》是一本深受开发者欢迎的设计模式学习书籍,尤其对于初学者而言,其独特的教学方式使得复杂的概念变得易于理解。这本书以其高清的中文版PDF格式提供,结合书中源码,为读者提供了深入实践的可能...
head first 设计模式 高清中文版 pdf
Head First设计模式, 带目录
Head First 设计模式(中文完整版+附书源码 c# java Head First 设计模式(中文版) pdf 《Head First 设计模式》附书源码 《Head First 设计模式》附书源码(C#版) zip 《Head First 设计模式》附书源码(Java版)...
全书用两章篇幅对设计模式和GRASP作了基本介绍,3种设计模式的讲解:对于每一种模式,先给出定义,接着通过类比方式用一个现实世界中的例子说明模式的应用,然后分别以C#和Java代码例述模式的架构实现。最后一章给出...
Head First设计模式 Head First设计模式 Head First设计模式
《Head-First设计模式》是一本面向初学者的优秀设计模式教程,主要针对Java编程语言。这本书通过易于理解的方式介绍了23种经典的GoF设计模式,帮助开发者提升代码的可复用性和可维护性。设计模式是软件工程中的重要...
head first设计模式 下载地址 head first设计模式 下载地址 head first设计模式 下载地址 head first设计模式 下载地址 head first设计模式 下载地址
HeadFirst设计模式(中文版)高清版 第二部分
Head First设计模式, 中国电力出版社出版,英文书名:Head First Design Patterns。作者:弗里曼。《Head First设计模式》荣获2005年第十五届Jolt通用类图书震撼大奖。英文影印版被《程序员》等机构评选为2006年受...
《HeadFirst设计模式》是一本深受开发者欢迎的书籍,它以独特、易理解的方式介绍了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的最佳实践,它们为软件设计提供了可复用的...
重视大脑的学习指南Head First设计模式,学习为何朋友们对工厂模式的认知可能有错,把事关紧要的模式直接装入脑海里,发掘模式大师的秘密,避免一些尴尬的错误,探究星巴兹咖啡如何以装饰者模式让自己的股价翻倍。
Head First设计模式高清非扫描中文版.zip.002。一共三个压缩包,都上传了
总的来说,这个压缩包包含的资源可以帮助你深入理解设计模式,通过《HeadFirst设计模式》和《HeadFirst in Java》的源码,你可以学习到如何在实际项目中应用这些模式。而UML类图则提供了直观的视角,便于你把握设计...
注:在第六章 命令模式(包括)之后一部分为影印版PDF,电脑上是不影响阅读的,手机上应该也没多大问题,介意的慎下
《Head First设计模式》是一本深受开发者欢迎的设计模式教程,以其独特的视觉呈现方式和易于理解的语言,让初学者也能快速掌握设计模式的核心概念。这本书深入浅出地介绍了23种GOF(GoF,Gamma、Erich、Johnson、...
《Head First 设计模式》的英文版是一本面向初学者的设计模式入门书籍,它以幽默风趣的文风,深入浅出地介绍了软件设计中经常使用的设计模式。设计模式是一套被反复使用、多数人知晓、经过分类编目、代码设计经验的...