java中23种设计模式--状态模式

本文深入解析状态模式,探讨其在程序设计中的应用。通过电视机开关机状态实例,展示如何使用状态模式封装不同状态下对象的行为,避免复杂的if-else判断,提高代码的可读性和可维护性。

兄弟们,老铁们.又到了学习锻炼我们可爱小小大脑的时候了~~~~~ 今天继续来学习设计模式,正所谓一天一个效果不错!!
喝了这碗鸡血,学就完了~~~
学习是为了长大后遇到自己喜欢的人的时候吧不自惭形愧。能光鲜亮丽的出现。

1.状态模式定义

GOF中给状态模式的定义为:允许一个对象在其内部状态改变时改变它的行为.
能够让程序根据不同的外部情况来做出不同的响应,最简单的方法就是在程序中使用 if else来讲可能发生的外部情况全部考虑到再通过判断进行选择响应.但是这种方法对于发咋的状态判断就会变得混乱容易产生错误.而增加一个新的状态也会带来大量的修改.

2.状态模式结构

状态模式可以有效地替换程序中的if else语句:将不同条件下的行为封装在一个类里面,再给这些类一个统一的父类来进行约束.

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

在这里插入图片描述

3.实现

一个电视机有两种状态,关机状态和开机状态.关机状态只能开机,开机状态可以上下换台和关机.

抽象状态类

public interface State {

  /**
   * 开机
   */
  void onState();

  /**
   * 关机
   */
   void offState();

  /**
   * 上一个频道
   */
   void previousState();

  /**
   * 下一个频道
   */
   void nextState();
}

电视机类

public class TV {

  //起始状态
  private State state;

  //关机状态
  private State offState;
  //开机状态
  private State onState;

  //起始状态为关机
  public TV(){
    offState = new OffState(this);
    onState = new OnState(this);

    state = offState;
  }

  //关机
  public void offState(){
    state.offState();
  }

  //下一个频道
  public void next(){
    state.nextState();
  }

  //上一个频道
  public void previousState(){
    state.previousState();
  }

  //开机
  public void onState(){
    state.onState();
  }

  public State getState() {
    return state;
  }

  public void setState(State state) {
    this.state = state;
  }

  public State getOffState() {
    return offState;
  }

  public void setOffState(State offState) {
    this.offState = offState;
  }

  public State getOnState() {
    return onState;
  }

  public void setOnState(State onState) {
    this.onState = onState;
  }
}

关机状态类

public class OffState implements State {

  TV tv;

  public OffState(TV tv){
    this.tv = tv;
  }

  @Override
  public void onState() {
    System.out.println("电视开机:欢迎~~~");
    //状态变为开机
    tv.setState(tv.getOnState());
  }

  @Override
  public void offState() {
    //无操作
  }

  @Override
  public void previousState() {
    //无操作
  }

  @Override
  public void nextState() {
    //无操作
  }
}

开机状态类

public class OnState implements State{

  TV tv;

  public OnState(TV tv){
    this.tv = tv;
  }

  @Override
  public void onState() {
    //无操作
  }

  @Override
  public void offState() {
    System.out.println("电视关机:欢迎下次观看~~~~~");
    tv.setState(tv.getOnState());
  }

  @Override
  public void previousState() {
    System.out.println("进入------上一个频道");
    tv.setState(tv.getOnState());
  }

  @Override
  public void nextState() {
    System.out.println("进入------下一个频道");
    tv.setState(tv.getOnState());
  }
}

测试类

public static void main(String[] args) {
    TV tv = new TV();
    tv.onState();
    tv.next();
    tv.previousState();
    tv.offState();
  }

输出

电视开机:欢迎~~~
进入------下一个频道
进入------上一个频道
电视关机:欢迎下次观看~~~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值