设计模式之第21章-状态模式(Java实现)
设计模式之第21章-状态模式(Java实现)
“what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊。话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武功的,想不无敌都难啊,还有那个blablabla”(作者已被拖走)。咳咳,今天那个状态哥哥马不停蹄的赶过来,下面闪亮登场。
状态模式之自我介绍
今天不在状态,可能是由于宇宙差的原因,好了,先说下定义:Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.也就是说当一个对象内在改变的时候允许其改变行为,这个对象看起来像改变了其类。本人的核心就是“封装”,没错,不是传说中的“银鳞胸甲”的蓝装。状态的变更会引起行为的变更,从外部看来就像这个对象对应的类发生了改变一般,哥们的通用类图如下:

鱼哥不在我就多扯一点:Context将与状态相关的请求委托给当前的ConcreteState对象处理,然后呢,Context可以将自身作为一个参数传递给处理该请求的状态对象,使得状态对象在必要时可以访问Context,Context是客户使用的主要接口,客户可用状态对象来配置一个Context,一旦一个Context配置完毕,它的客户不再需要直接与状态对象打交道。Context或者ConcreteState子类都可以决定哪个状态是另外哪一个的后继,以及是在何种条件下进行状态转换的。
状态模式之自我分析
首先介绍下如下的优点:
- 将与特定状态相关的行为局部化,并且将补不同状态的行为分割开来很好的体现了开放原则以及单一职责原则。增加状态以及修改状态变得简单易行。
- 避免了程序的复杂性,提高了系统的可维护性。使得结构清晰。
- State对象可被共享。
金无足赤,人无完人,我自然也不能例外了,缺点其实就一个:
- 状态过多的话,就会使得子类膨胀了。
状态模式之实现
今天我们就以作者大大昨晚的活动来举栗子说明如何实现,首先我们实现下Context的类,这个是很重要的,代码如下:
public class Context{
//定义状态
public final static State STATE1 = new ConcreteState1();
public final static State STATE2 = new ConcreteState2();
//当前状态
private State CurrentState;
//get方法获取当前状态
public State getCurrentState(){
return CurrentState;
}
//set方法设置当前状态
public State setCurrentState(State currentState){
this.CurrentState = currentState;
//切换状态
this.CurrentState.setContext(this);
}
//行为委托
public void handle1(){
this.CurrentState.handle1();
}
public void handle2(){
this.CurrentState.handle2();
}
}
恩,这个Context类定义了客户端需要的接口,并且还负责状态的切换,也就是工作都是靠他来完成了,接下来就是状态的抽象类了,定义了一个让子类访问的接口,以及抽象行为:
public abstract class State{
//定义Context角色,提供子类访问
protected Context context;
//设置Context角色
public void setContext(Context context){
this.context = context;
}
//行为1
public abstract void handle1();
//行为2
public abstract void handle2();
}
然后是第一个状态的具体实现的代码,继承自State抽象类:
public class ConcreteState1 extends State{
@Override
public void handle1{
System.out.println("看小笼包");
}
@Override
public void handle2{
//设置当前状态为state2
super.context.setCurrentState(Context.STATE2);
//过渡到state2,由Context实现
super.context.handle2();
}
}
最后是第二个状态具体实现类,是看新番了:
public class ConcreteState1 extends State{
@Override
public void handle1{
//设置当前状态为state1
super.context.setCurrentState(Context.STATE1);
//过渡到state2,由Context实现
super.context.handle1();
}
@Override
public void handle2{
System.out.println("看新番");
}
}
好吧,作者就在这两个状态中无限切换来着,然后,然后就无法自拔,然后就精神萎靡,再然后就没有然后了~
状态模式之应用场景
主要应用场景有二,欸看我干嘛。我不二,是场景二,错了,场景也不二,是场景有两个:
- 当一个对象的行为取决于它的状态,并且它必须在必须在运行时刻根据状态改变它的行为。
- 一个操作中有很多的分支语句以及条件语句时,并且这些分支/条件语句依赖于该对象的状态,也就轮到我登场了。
以上。(后话:据说因为状态模式黑作者,被作者关小黑屋一周。)
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
设计模式之第21章-状态模式(Java实现)的更多相关文章
- 设计模式之第17章-备忘录模式(Java实现)
设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...
- 设计模式之第9章-原型模式(Java实现)
设计模式之第9章-原型模式(Java实现) “快到春节了,终于快放假了,天天上班好累的说.”“确实啊,最近加班比较严重,项目快到交付了啊.”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧, ...
- 设计模式之第7章-外观模式(Java实现)
设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...
- 设计模式之第22章-组合模式(Java实现)
设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...
- 设计模式之第20章-访问者模式(Java实现)
设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...
- 设计模式之第16章-代理模式(Java实现)
设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...
- 设计模式之第14章-命令模式(Java实现)
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
- 设计模式之第11章-建造者模式(Java实现)
设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...
- 设计模式之第10章-桥接模式(Java实现)
设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...
随机推荐
- javascript数组属性及方法
数组元素的添加 1. arrayt.splice(index,howmany,item1,.....,itemX) 向/从数组中添加/删除项目,然后返回被删除的项目 2. array.unshift( ...
- .net reflector 的缺陷
.net reflector是一个反编译DLL的工具,在安装后如果电脑上有VS也会同时安装到VS里面,但是他是收费的,虽然反编译的效果很好,但是运行VS2013时(或许其他版本也有这样的问题)如果项目 ...
- 【BZOJ4327】[JSOI2012] 玄武密码(AC自动机的小应用)
点此看题面 大致题意: 给你一个长度为\(len\)的文本串和\(n\)个模式串,让你求出每一个模式串的前缀与文本串的最大匹配串长度(其中模式串和文本串都只由字符'E','S','W','N'组成). ...
- 设置和重置ssh key
查看本地是否有已经生成好的ssh key $ cat ~/.ssh/id_rsa.pub 若有,先删除: $ cd ~ $ rm -rf .ssh 重新生成ssh key ssh-keygen -t ...
- python_75_json与pickle序列化2
import pickle def say(name):print('Hi!',name)#用完会释放,要想反序列化,要重新写上该函数 info={ 'name':'Xue Jingjie', 'ag ...
- 操作系统(6)_虚拟存储管理_李善平ppt
image含各种段. 有些不需要的页可能永远不需要装入内存,可能只有百分之70-80是异常情况采用的,这种代码就可以放入硬盘. 抖动实际就是进程数太多导致内存不够用造成的. 页面换入换出在内存和磁盘之 ...
- CSS的垂直居中和水平居中总结
内联元素居中方案 水平居中设置: 行内元素 设置 text-align:center: Flex布局 设置display:flex;justify-content:center;(灵活运用) 垂直居中 ...
- SummerVocation_Learning--java的线程死锁
public class Test_DeadLock implements Runnable { ; static Object o1 = new Object(),o2 = new Object() ...
- Mysql的一些纪要
unsigned 整型的每一种都分无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如 ...
- 第1章 VMware中安装CentOS7
目录 1.1 下载CentOS7安装包 1.2 VMware中新建虚拟机 1.3 安装操作系统 本章讲解在VMware中安装CentOS虚拟机的步骤.使用的VMware Workstation版本为1 ...