当前位置: 移动技术网 > IT编程>软件设计>设计模式 > 设计模式 | 状态模式(state)

设计模式 | 状态模式(state)

2019年06月03日  | 移动技术网IT编程  | 我要评论
定义: 定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 结构:(书中图,侵删) 一个抽象的状态类,拥有一个与状态相关的行为方法 若干个具体的状态类 一个上下文类,持有抽象状态类 实例: 写到这里,看了一眼桌上的零食,想到了一个例子。 食品大概分为三个阶段,或者说三种 ...

定义:

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

结构:(书中图,侵删)

 

一个抽象的状态类,拥有一个与状态相关的行为方法
若干个具体的状态类
一个上下文类,持有抽象状态类
 

实例:

写到这里,看了一眼桌上的零食,想到了一个例子。
食品大概分为三个阶段,或者说三种状态:最佳食用期,可食用期(过了最佳食用期,但未过期),已过期。
食品类(包含:最佳食用天数、过期天数、出厂天数):
package designpattern.state;

public class food {
    private string name;
    private int manufacturedays;// 出厂天数
    private int bestbeforedays;// 最佳食用天数(从出厂时间算起)
    private int expirydays;// 保质期天数
    private foodstate foodstate;

    public food(string name, int bestbeforedays, int expirydays) {
        this.name = name;
        this.bestbeforedays = bestbeforedays;
        this.expirydays = expirydays;
        this.foodstate = new bestbeforestate();
    }

    public void eat() {
        foodstate.reaction(this);
    }

    public string getname() {
        return name;
    }

    public void setname(string name) {
        this.name = name;
    }

    public int getmanufacturedays() {
        return manufacturedays;
    }

    public void setmanufacturedays(int manufacturedays) {
        this.manufacturedays = manufacturedays;
    }

    public int getbestbeforedays() {
        return bestbeforedays;
    }

    public void setbestbeforedays(int bestbeforedays) {
        this.bestbeforedays = bestbeforedays;
    }

    public int getexpirydays() {
        return expirydays;
    }

    public void setexpirydays(int expirydays) {
        this.expirydays = expirydays;
    }

    public foodstate getfoodstate() {
        return foodstate;
    }

    public void setfoodstate(foodstate foodstate) {
        this.foodstate = foodstate;
    }

}
抽象状态类:
package designpattern.state;

public interface foodstate {
    public void reaction(food food);
}
具体状态类:
最佳食用状态:
package designpattern.state;

public class bestbeforestate implements foodstate {

    @override
    public void reaction(food food) {
        if (food.getmanufacturedays() <= food.getbestbeforedays()) {
            system.out.print("第" + food.getmanufacturedays() + "天吃,");
            system.out.println("[" + food.getname() + "]在最佳食用期中,好吃~~");
        } else {
            food.setfoodstate(new eatablestate());
            food.eat();
        }
    }

}
可食用状态:
package designpattern.state;

public class eatablestate implements foodstate {

    @override
    public void reaction(food food) {
        if (food.getmanufacturedays() <= food.getexpirydays()) {
            system.out.print("第" + food.getmanufacturedays() + "天吃,");
            system.out.println("[" + food.getname() + "]在可食用期中,味道还可以");
        } else {
            food.setfoodstate(new expiredstate());
            food.eat();
        }
    }

}
已过期状态:
package designpattern.state;

public class expiredstate implements foodstate {

    @override
    public void reaction(food food) {
        if (food.getmanufacturedays() > food.getexpirydays()) {
            system.out.print("第" + food.getmanufacturedays() + "天吃,");
            system.out.println("[" + food.getname() + "]过期了,没法吃了");
        } else {
            food.setfoodstate(new eatablestate());
            food.eat();
        }
    }

}
客户端:
package designpattern.state;

public class client {
    public static void main(string[] args) {
        food food = new food("面包", 1, 7);// 设置最佳食用期1天,保质期7天
        food.setmanufacturedays(1);
        food.eat();

        food.setmanufacturedays(3);
        food.eat();

        food.setmanufacturedays(10);
        food.eat();
    }
}

结果输出:

第1天吃,[面包]在最佳食用期中,好吃~~
第3天吃,[面包]在可食用期中,味道还可以
第10天吃,[面包]过期了,没法吃了

总结:

依旧是为了解耦的一个设计模式,通过抽象的方式来实现,感觉光看代码的话,很多设计模式其实长得都很像,本质区别只是在应用的场景上。
主要是理解在什么情况下应该用哪个设计模式。
而状态模式主要是用在,对象的行为依赖于它的状态,且状态间转换的条件判断相对比较复杂的情况,表现在代码中就是有很多条件判断分支。
从上面的例子,可以看出各个状态间的转换有一种传递的关系,而不是把所有其他的条件判断都写在里面,这样可以保证当前的状态只关注和自己相关的条件。

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网