美文网首页
状态模式 ~ 设计模式之二

状态模式 ~ 设计模式之二

作者: 喏喏2021 | 来源:发表于2021-12-26 22:18 被阅读0次

为啥第2个说状态模式呢,说是这两种模式在使用结构上有点相似,不过,实际上也的确是这样的,呵呵,下面细说。

1. 定义

整个对象的行为,基于它的状态变化,各个状态之间可以动态切换,且状态切换时,对象内部还有一些其他逻辑的变化。

2. 优点

1)代码结构清晰:原本可能所有状态的逻辑,都集中或是分散在单个类里,真正去理解单个状态的行为动作时,会比较繁杂一些
2)将各个状态独立出来后,方便后续理解和维护

3. 缺点

1)会增加系统的类和实例的数量
2)单独抽出状态类后,可能会增加系统开发的复杂度
3)不是完全支持开闭原则,添加新状态,并切换状态时,需要调整原有代码

4. 结构

  • 抽象状态类: 定义一个接口,用以封装各个状态下的特定行为
  • 具体状态:实现抽象状态所对应的行为,并在满足条件的情况下切换状态
  • 环境类:定义相关业务接口,并维护一个状态引用

5. 实现

妈妈做饭的状态可能是多种多样的,分开心的时候,生气的时候,呵呵。

package pattern.state;

//做饭状态
interface CookState {
    public void cook(Context context);
}

//开心做饭状态
class HappyCookState implements CookState {

    @Override
    public void cook(Context context) {
        String content = context.getContent();
        if(content.equals("我不喜欢吃蔬菜")){
            System.out.println("不喜欢吃,不能说,妈妈要生气了");
            context.setCookState(new AngryCookState());
        }
    }
}

//生气做饭状态
class AngryCookState implements CookState {

    @Override
    public void cook(Context context) {
        String content = context.getContent();
        if(content.equals("你好漂亮")){
            System.out.println("妈妈开心了,说不定,还加个菜,太棒了!");
            context.setCookState(new HappyCookState());
        }
    }
}

//环境
class Context {
    private CookState cookState; //保留的一个状态引用
    private String content; //和妈妈交流的内容
    
    public Context(){
        this.cookState = new HappyCookState();
    }
    
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
    
    public CookState getCookState() {
        return cookState;
    }

    public void setCookState(CookState cookState) {
        this.cookState = cookState;
    }

    //接口外部请求
    public void talkHandler(String content){
        this.content = content;
        cookState.cook(this);
    }
}

public class StateTest {
    public static void main(String[] args) {
        Context context = new Context();
        context.talkHandler("我不喜欢吃蔬菜");
        context.talkHandler("你好漂亮");
    }
}
//不喜欢吃,不能说,妈妈要生气了
//妈妈开心了,说不定,还加个菜,太棒了!

相关文章

  • 状态模式 ~ 设计模式之二

    为啥第2个说状态模式呢,说是这两种模式在使用结构上有点相似,不过,实际上也的确是这样的,呵呵,下面细说。 1. 定...

  • 设计模式-状态模式

    设计模式-状态模式 设计模式 状态模式的关键是区分事物内部的状态

  • 设计模式——状态模式

    设计模式——状态模式 在状态模式中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 优点: 减少...

  • 设计模式-状态设计模式

    1.定义 对于某个操作,由于其状态的不同,表现出的行为会不同(如遥控器进行音量增加的操作,在电视是开机状态下是可以...

  • 设计模式——状态模式

    前言 设计模式是指导一个程序猿以更好的姿态处理一些问题,而不再像刚学编程的我们,只会使用if-else分支语句,或...

  • 设计模式--状态模式

    基本常识:策略模式与状态模式是双胞胎,在出生时才分开。 假设公司有个糖果机,1当糖果机由糖果,投入25分钱,转动曲...

  • 设计模式——状态模式

    在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的:状态模式,又称状态对象模式(Patte...

  • 设计模式《状态模式》

    引言   上一节我们说了策略模式。这一节我们讲讲策略模式的双胞胎弟弟:状态模式,这个模式大家可能不常见,也不常用,...

  • 设计模式——状态模式

    定义 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行...

  • 设计模式 - 状态模式

    模式定义 允许一个对象在其内部状态发生改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式(State Pa...

网友评论

      本文标题:状态模式 ~ 设计模式之二

      本文链接:https://www.haomeiwen.com/subject/lpxeqrtx.html