Java设计模式-22、状态模式-处理对象的多种状态及其相互转换

第22章:状态模式-处理对象的多种状态及其相互转换

定义:

状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

image-20201122170442199

结构:

image-20201122171843916

代码实现:

//抽象状态类
abstract class State {
   
    //声明抽象业务方法,不同的具体状态类可以不同的实现
    public abstract void handle();
}
//具体状态类
class ConcreteState extends State {
   
    public void handle() {
   
        //方法具体实现代码
    }
}
//环境类:拥有多种状态的对象
class Context {
   
    private State state; //维持一个对抽象状态对象的引用
    private int value; //其他属性值,该属性值的变化可能会导致对象状态发生变化

    //设置状态对象
    public void setState(State state) {
   
        this.state = state;
    }

    public void request() {
   
        //其他代码
        state.handle(); //调用状态对象的业务方法
        //其他代码
    }
    
}
  1. 可以在环境类中提供专门方法进行状态转换
    public void changeState() {
   
        //判断属性值,根据属性值进行状态转换
        if (value == 0) {
   
            this.setState(new ConcreteStateA());
        } else if (value == 1) {
   
            this.setState(new javaConcreteStateB());
        }
        //......
    }
  1. 也可以在具体状态类中提供专门方法进行状态转换
public void changeState(Context ctx) {
   
    //根据环境对象中的属性值进行状态转换
    if (ctx.getValue() == 1) {
   
        ctx.setState(new ConcreteStateB());
    } else if (ctx.getValue() == 2) {
   
        ctx.setState(new ConcreteStateC());
    }
    //......
}

应用实例:

银行信用卡系统

账户三种状态:

  1. 账户余额>=0,正常状态,可存可取
  2. -2000<账户余额<0,透支状态,可存可取,计算利息
  3. 账户余额=-2000,受限状态,只能存,计算利息

image-20201122170539334

package wgg;

//账户类
class Account {
   
    private String state; //状态
    private int balance; //余额
    //......

    //存款操作
    public void deposit() {
   
        //存款
        stateCheck();
    }

    //取款操作
    public void withdraw() {
   
        //账户为正常或透支状态时可取
        if (state.equalsIgnoreCase("NormalState") || state.equalsIgnoreCase("OverdraftState")) {
   
            //取款
            stateCheck();
        } else {
   
            //取款受限
        }
    }

    //计算利息操作
    public void computeInterest() {
   
        if (state.equalsIgnoreCase("OverdraftState") || state.equalsIgnoreCase("RestrictedState")) {
   
            //计算利息
        }
    }

    //状态检查和转换操作
    public void stateCheck() {
   
        if (balance >= 0) {
   
            state = "NormalState";
        } else if (balance > -2000 && balance < 0) {
   
            state = "OverdraftState";
        } else if (balance == -2000) {
   
            state = "RestrictedState";
        } else if (balance < -2000) {
   
            //操作受限
        }
    }
    //......
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象是一种程序设计的思想,它将程序中的数据和对数据的操作封装在一起,形成对象对象是类的一个实例,类定义了对象的属性和行为。在Java中,面向对象的概念包括类与对象的关系、封装、构造函数、this关键字、static关键字以及设计模式等方面。 设计模式是在软件设计中常用的解决问题的经验总结,它提供了一套可重用的解决方案。在Java中,单例设计模式是一种常见的设计模式之一,它保证一个类只有一个实例,并提供一个全局访问点。通过使用单例设计模式,可以确保在程序中只有一个对象实例被创建,从而节省了系统资源并提高了性能。 通过使用单例设计模式,可以实现以下效果: - 限制一个类只能有一个实例。 - 提供一个全局访问点,使其他对象可以方便地访问该实例。 - 保证对象的唯一性,避免多个对象状态不一致。 在Java中,实现单例设计模式多种方式,包括饿汉式、懒汉式、双重检测锁等。每种方式都有各自的特点和适用场景,开发者可以根据具体的需求选择合适的实现方式。设计模式是一种通用的解决问题的方法,它可以在面向对象的程序设计中提供灵活、可复用的解决方案。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [计算机后端-Java-Java核心基础-第15章 面向对象07 14. 设计模式与单例设计模式.avi](https://download.csdn.net/download/programxh/85435560)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [完整版Java全套入门培训课件 Java基础 03-面向对象(共18页).pptx](https://download.csdn.net/download/qq_27595745/21440470)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值