JAVA设计模式之状态模式

      上一篇学了策略模式,再来看状态模式,显得就很简单了,它和策略模式很相似,它同样属于对象型行为模式,

状态模式:当一个对象的内在状态改变时改变其行为,这个对象看起来就像改变了它的类一样。

状态模式的类图结构如下图:

这里写图片描述

在状态模式中,主要涉及了如下几个角色:

  1. 环境角色(也称上下文):定义客户端所感兴趣的接口,并且保留一个具体状态类的实例,这个具体状态类实例给出此环境对象的现有状态。
  2. 抽象状态角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。
  3. 具体状态角色:每一个具体状态类都实现了环境的一个状态所对应的行为:

下面举一个常见的例子:

断点下载的问题

在做下载功能的时候,有未下载,正在下载中,下载完成等,现在我们就以下载功能的状态作为例子。

状态模式的代码实现

抽象状态角色:
State.java:

public interface State {
    void downloadState();
}

具体状态角色未下载状态
DownloadStart.java

public class DownloadStart implements State{

    @Override
    public void downloadState() {
        // 未下载
        System.out.println("还未下载");
    }

}

具体状态角色下载中状态
Downloading.java

public class Downloading implements State{

    @Override
    public void downloadState() {
        // 正在下载
        System.out.println("正在下载");
    }

}

具体状态角色下载完成状态
Downloaded.java

public class Downloaded implements State{

    @Override
    public void downloadState() {
        // 下载完成
        System.out.println("下载完成");
    }

}

环境角色Context.java

public class Context {
    private State state = new DownloadStart();

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

Client.java

public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        context.downloadState();
        context.setState(new Downloading());
        context.downloadState();
        context.setState(new Downloaded());
        context.downloadState();
    }
}

测试结果输出:

还未下载
正在下载
下载完成

总结:

状态模式和策略模式的区别:
状态模式和策略模式觉够完全一样的,
但是他们的目的、实现、本质是完成不一样的。状态模式的行为是平行性的,所谓平行性,指的是各个状态的行为所处的层次是一样的,相互独立的,没有关联的。不可相互替换的,而策略模式的行为是平等的,是可以相互替换的。

状态模式的优缺点

优点:

避免了为判断状态而产生的巨大if -elseif语句,将对象行为交给状态类维护,对于上层程序而言,仅需要维护状态之间的转换规则。

缺点:

会导致默写系统有过多的具体状态类

好了,状态模式我们就学习到这里了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值