JAVA设计模式(十七) -- 状态模式

一、概念

状态模式:允许一个对象在其内部状态改变时改变它的行为。

二、组成结构

1 ) 使用环境(Context)角色: 客户程序是通过它来满足自己的需求。它定义了客户程序需要的接口;并且维护一个具体状态角色的实例,这个实例来决定当前的状态。
2 ) 状态(State)角色: 定义一个接口以封装与使用环境角色的一个特定状态相关的行为。
3 ) 具体状态(Concrete State)角色: 实现状态角色定义的接口。

类图:
在这里插入图片描述

三、示例代码

环境角色 - Context

public class Context {
   private State state;
 
   public Context(State state){
      this.state = state;
   }
   public State getState(){
      return state;
   }
   public String request(){
      return state.handler ();
   }
}

状态角色,具体状态角色

public interface State {
   String handler();
}
public class StartState implements State {
 
   public String handler() {
      System.out.println("开始状态,处理。");
      return "Started";
   }
}
public class FinishState implements State {
 
   public String handler() {
      System.out.println("结束状态,处理!");
      return "Finished!";
   }
}

测试

public class Main {
    public static void main(String[] args) {

        StartState startState = new StartState();
        FinishState finishState = new FinishState();

        Context context = new Context(startState);
        System.out.println(context.request ());
        context = new Context(finishState);
        System.out.println(context.request ());
    }
}

结果:
在这里插入图片描述

四、状态模式与策略模式

strategy 模式在结构上与 state模式非常相似,但是在概念上,他们的目的差异非常大。区分这两个模式的关键是看行为是由状态驱动还是由一组算法驱动,这条规则似乎有点随意,但是在判断时还是需要考虑它。
通常,State 模式的“状态”是在对象内部的,Strategy 模式的“策略”可以在对象外部,不过这也不是一条严格、可靠的规则。

策略模式中,算法是否变化完全是由客户程序开决定的,而且往往一次只能选择一种算法,不存在算法中途发生变化的情况。
而状态模式如定义中所言,在它的生命周期中存在着状态的转变和行为得更改,而且状态变化是一个线形的整体;对于客户程序来言,这种状态变化往往是透明的。

五、状态模式的优点

适用范围:
1 ) 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
2 ) 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

优点:
1 )减少分支条件的判断;
2 )减少耦合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Funnee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值