设计模式❤状态机模式

状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。通过改变对象内部的状态,使得你可以在运行时动态改变一个对象的行为。

状态模式的示意性类图

首先我们设定一个奥特曼的接口

 interface Ultraman {

    void attackMonster();

    void shapeShift();

    void shooting();

    void usePower();
}

这个奥特曼有3种状态:

/**人类状态**/
public class personState implements Ultraman {
    private Context context;


      personState(Context context){
        System.out.println("我是一个人 !!");
        this.context=context;
    }

    @Override
    public void attackMonster(){
        System.out.println("人类打不赢怪兽,快变身吧");

    }

    @Override
    public void shapeShift(){
        System.out.println("变成奥特曼了");
        context.setState(context.becomeUltraman());
    }

    @Override
    public void shooting(){
        System.out.println("射击!!");

    }


    @Override
    public void usePower() {

    //do nothing
    }
   }

/**力量用完的状态**/
class powerOffState implements Ultraman {
    private Context context;

    powerOffState(Context context) {
        this.context = context;

    }

    @Override
    public void attackMonster() {

    }

    @Override
    public void shapeShift() {
        System.out.println("变成人了");
        context.setState(context.becomePeople());
    }

    @Override
    public void shooting() {
        System.out.println("手太大,射击技能不能使用");
    }


    @Override
    public void usePower() {
        System.out.println("能量用完了");
    }
}

/**正常奥特曼状态**/
public class ultramanState implements Ultraman {
    private Context context;

    ultramanState(Context context) {
        this.context = context;
    }

    @Override
    public void attackMonster() {
        System.out.println("攻击小怪兽");
        context.resultMonster();

    }

    @Override
    public void shapeShift() {
        System.out.println("变成人了");
        context.setState(context.becomePeople());
    }

    @Override
    public void shooting() {
        System.out.print("手太大,射击技能不能使用");
    }


    @Override
    public void usePower() {
        System.out.println("消耗能量一颗");
    }

}

这是一个环境角色部分,定义用户需要或者说感兴趣的接口

public class Context {

    private Ultraman personState;
    private Ultraman powerOffState;
    private Ultraman ultramanState;
    private Ultraman ultraman;
    private int powerValue;


    public Context() {
        this.personState = new personState(this);
        this.powerOffState = new powerOffState(this);
        this.ultramanState = new ultramanState(this);
        this.ultraman = personState;
    }

    //设置当前处于的状态
     void setState(Ultraman ultraman) {

        this.ultraman = ultraman;
    }


    //变身  变身前初始化能量
    public void shapeShift(int powerValue) {
        this.powerValue = powerValue;
        ultraman.shapeShift();

    }

    //变成人
      Ultraman becomePeople() {
        return personState;
    }

    //变成怪兽
      Ultraman becomeUltraman() {

        return ultramanState;
    }

    //打怪兽的结果
     void resultMonster() {

        if (powerValue > 0) { //能量没有用完
            ultraman.usePower();
            System.out.println("哈哈哈 恭喜击败小怪兽1只");
            powerValue--;
        } else {
            //能量用完转化成能量用完状态
            this.setState(powerOffState);
            ultraman.usePower();
            System.out.println("你被小怪兽击败了");

        }
    }


    //攻击怪兽
    public void battle() {
        ultraman.attackMonster();

    }

    //射击
    public void shooting() {
        ultraman.shooting();
    }


}

实际调用部分

public class battleTest {
    public static  void  main(String[] args){
         int powerValue=1;              //初始化奥特曼的能量为5
        Context context=new Context();
        System.out.println("怪兽出现了0口0");
        context.shooting();             //人类可以射击
        context.battle();             //人类可以射击
        context.shapeShift(powerValue); //射击不成功,变身
        for(int i=0;i<1;i++){           //出现了四只怪兽,打败了所有怪兽
        context.battle();
        }
        context.shapeShift(powerValue);  //打完怪兽,变回人
        context.shooting();              //人类可以射击
        context.shapeShift(powerValue);   //又变成怪兽
        for(int i=0;i<2;i++){             //出现了六只怪兽,被打败
            context.battle();
        }
    }

}

和策略模式存在的区别:【自己切换和主动切换】
状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作练习。

在jdk里的应用:

java.util.Iterator
javax.faces.lifecycle.LifeCycle#execute()

参考:http://blog.csdn.net/seacean2000/article/details/10528153

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,103评论 18 139
  • 《JavaScript设计模式与开发实践》作者:曾探 系统的介绍了各种模式,以及js中的实现、应用,以及超大量高质...
    undefinedR阅读 784评论 0 10
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,820评论 1 15
  • 设计模式基本原则 开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。开-闭原...
    西山薄凉阅读 3,669评论 3 13
  • 在所有过去和将来,所有值得怀念与值得期待的景色里,依然还是你。 赋诗一首,情怀依旧: 《在蝉鸣的夏夜》 我左手提瓜...
    春风小小僧阅读 259评论 1 1