设计模式之第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实现)的更多相关文章

  1. 设计模式之第17章-备忘录模式(Java实现)

    设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...

  2. 设计模式之第9章-原型模式(Java实现)

    设计模式之第9章-原型模式(Java实现) “快到春节了,终于快放假了,天天上班好累的说.”“确实啊,最近加班比较严重,项目快到交付了啊.”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧, ...

  3. 设计模式之第7章-外观模式(Java实现)

    设计模式之第7章-外观模式(Java实现) “鱼哥,知道怎么把大象装进冰箱里面么?”(作者按:这么简单的问题还想考我,早了几百年吧.)“把大象装进冰箱里,一共需要三步:第一步,把冰箱门打开:第二步,把 ...

  4. 设计模式之第22章-组合模式(Java实现)

    设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎 ...

  5. 设计模式之第20章-访问者模式(Java实现)

    设计模式之第20章-访问者模式(Java实现) “嘿,你脸好红啊.”“精神焕发.”“怎么又黄了?”“怕冷,涂的,涂的,蜡.”“身上还有酒味,露馅了吧,原来是喝酒喝的啊.”“嘿嘿,让,让你发现了,今天来 ...

  6. 设计模式之第16章-代理模式(Java实现)

    设计模式之第16章-代理模式(Java实现) “现在朋友圈真是太让人蛋疼了啊.”“怎么说?”“一堆代理,各种卖东西的,看着好烦人.”“哎,删了呗.”“都是朋友,哪里好意思删啊.”“这倒也是...哎,迫 ...

  7. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

  8. 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...

  9. 设计模式之第10章-桥接模式(Java实现)

    设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...

随机推荐

  1. hihoCoder hiho一下 第一周 #1032 : 最长回文子串 (Manacher)

    题意:给一个字符串,求最长回文子串的长度. 思路: (1)暴力穷举.O(n^3) -----绝对不行. 穷举所有可能的出现子串O(n^2),再判断是否回文O(n).就是O(n*n*n)了. (2)记录 ...

  2. HDU1195 双向BFS(或BFS)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1195 , 双向BFS或者直接BFS也可以过. 其实这道题只是单向BFS就可以过的,但是为了练算法,所以 ...

  3. IOS UIActionSheet(底部 弹出框的使用)

    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定要注销?" delegate:self cancel ...

  4. codeforce 599B Spongebob and Joke

    一道水题WA那么多发,也是醉了.f看成函数的话,其实就是判断一下反函数存不存在. 坑点,只能在定义域内判断,也就是只判断b[i].没扫一遍前不能确定Impossible. #include<bi ...

  5. SQL 值得记住的点

    概要 记录在学习过程中,遇到的不懂且需要掌握的知识点.主要基于 MySQL.   汇总      replace 函数      删除重复      取子串 substr      项连接      ...

  6. window下安装ubuntu(ubuntu可删除)

    进入ububtu13.04的安装界面,这里我们选择了“中文(简体)”,然后单击安装: 下图是现场拍的:   出现如下图时,请根据需要选择,然后单击“继续” , 接下来会出现问你是否要连接网络,我们选择 ...

  7. Python监控日志中经常访问的ip

    一.需求:每分钟检查一次日志文件,如果这一分钟内同一个ip请求次数超过200次,加入黑名单 1.日志文件中,每一行的格式为:XXX.XXX.XXX.XXX - - [04/Jun/2017:05:25 ...

  8. MRCA|Wright–Fisher population genetic model|SNP rate

    (Panda has a high heterozygosity rate) 通过对mtDNA(为了预测SNP的密度)的分析,可知panda的多样性,当前全基因组数据才能完全建立模型. mitocho ...

  9. 查看电脑是否安装node.js

    打开命令行

  10. 学习sqlserver的函数方法

    http://www.w3school.com.cn/sql/func_datediff.asp SQL Server DATEDIFF() 函数 SELECT DATEDIFF(day,'2008- ...