设计模式之第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. RxJava 1升级到RxJava 2过程中踩过的一些“坑”

    RxJava2介绍 RxJava2 发布已经有一段时间了,是对 RxJava 的一次重大的升级,由于我的一个库cv4j使用了 RxJava2 来尝鲜,但是 RxJava2 跟 RxJava1 是不能同 ...

  2. kubernetes发布解释型语言应用的最佳实践

    说明 k8s在发布编译型语言的应用时,几乎不用多考虑,就会选择将编译好jar/war包(java语言)或者二进制文件(golang/c++)直接打到镜像当中,生成新的应用镜像,然后将镜像推到镜像仓库, ...

  3. 利用jsplumb和碰撞检测自动生成流程图

    使用jsplumb构建流程图模型时,有一个需求要求,选项可以从选项表中拖拽到指定容器,并且两个选项要接触到的时候才能连接起来,不接触不能连接.效果图如下 略丑- 因为这里用到了拖拽,拖放功能,所以用到 ...

  4. hiho一下 第三十七周 二分查找之k小数

    题目链接:http://hihocoder.com/contest/hiho37/problem/1 , 简单二分. 算法: 题目即为求一个无序数组数组中第k小的数,由于数据量太大,排序是会超时的. ...

  5. C基础的练习集及测试答案(提高题)

    提高题:1.编写程序,随机生成一个1~10内的数,让对方猜3次.如果3次内能猜中则输出“恭喜你”:若3次内猜不中则输出正确答案.C语言中提供生成随机数的函数rand()用法:①所需头文件:#inclu ...

  6. 自行解决12306页面显示异常的问题(长城宽带下WWW。12306无法正常使用)

    前二天突然发现家里所用的长城宽带的www.12306.cn无法正常显示,点击余票查询或者车票预订均打不开,加载时间非常长,现象好似CSS等资源文件未载入成功(如图所示)更换chrome.firefox ...

  7. hangfire使用

    1 . NuGet 命令行执行 Install-Package Hangfire2.首先在ConfigureServices 方法中注册服务: services.AddHangfire(r=>r ...

  8. #linux 命令使用 cp -未完结版

    下载了sublime 解压之后,想把文件夹放到opt目录,这里用命令cp将其复制过来 johnny@johnny-pc:~$ sudo cp -r ~/下载/Sublime_2.0.2 /opt/ [ ...

  9. [转载]AngularJS快速开始

    AngularJS快速开始 Hello World! 开始学习AngularJS的一个好方法是创建经典应用程序“Hello World!”: 使用您喜爱的文本编辑器,创建一个HTML文件,例如:hel ...

  10. log4j 配置文件 (XML/.properties)

    xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configurat ...