JAVA设计模式之【状态模式】

简介:
状态模式    水、固态、气态、液态    账户、正常状态、透支状态、受限状态    状态模式中,用一个状态类来分散冗长的条件语句,让系统有灵活性和可扩展性    状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题    角色        环境类Context            拥有多种状态的对象        抽象状态类State            定义一个接口来封装与环境类的一个特定状态相关的行为,相同的方法写在抽象状态类中        具体状态类ConcreteState            实现与环境类的一个状态相关的行为    状态转换方式        由环境类来充当状态管理器角色        由具体状态类来负责状态之间的转换

看例子

1.环境类,注册用户

package State;

/**
 * Created by Jiqing on 2016/10/29.
 */
public class ForumAccount {
    private AbstractState state;
    private String name;
    public ForumAccount(String name)
    {
        this.name=name;
        this.state=new PrimaryState(this);
        System.out.println(this.name + "注册成功!");
        System.out.println("---------------------------------------------");
    }

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

    public AbstractState getState()
    {
        return this.state;
    }

    public void setName(String name)
    {
        this.name=name;
    }

    public String getName()
    {
        return this.name;
    }

    public void downloadFile(int score)
    {
        state.downloadFile(score);
    }

    public void writeNote(int score)
    {
        state.writeNote(score);
    }

    public void replyNote(int score)
    {
        state.replyNote(score);
    }
}

2.抽象状态类

package State;

/**
 * Created by Jiqing on 2016/10/29.
 */
public abstract class AbstractState
{
    protected ForumAccount acc;
    protected int point;
    protected String stateName;
    public abstract void checkState(int score);

    public void downloadFile(int score)
    {
        System.out.println(acc.getName() + "下载文件,扣除" + score + "积分。");
        this.point-=score;
        checkState(score);
        System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
    }

    public void writeNote(int score)
    {
        System.out.println(acc.getName() + "发布留言" + ",增加" + score + "积分。");
        this.point+=score;
        checkState(score);
        System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
    }

    public void replyNote(int score)
    {
        System.out.println(acc.getName() + "回复留言,增加" + score + "积分。");
        this.point+=score;
        checkState(score);
        System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
    }

    public void setPoint(int point) {
        this.point = point;
    }

    public int getPoint() {
        return (this.point);
    }

    public void setStateName(String stateName) {
        this.stateName = stateName;
    }

    public String getStateName() {
        return (this.stateName);
    }
}

3.具体状态类

package State;

/**
 * Created by Jiqing on 2016/10/29.
 */
public class HighState extends AbstractState
{
    public HighState(AbstractState state)
    {
        this.acc=state.acc;
        this.point=state.getPoint();
        this.stateName="专家";
    }

    public void writeNote(int score)
    {
        System.out.println(acc.getName() + "发布留言" + ",增加" + score + "*2个积分。");
        this.point+=score*2;
        checkState(score);
        System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
    }

    public void downloadFile(int score)
    {
        System.out.println(acc.getName() + "下载文件,扣除" + score + "/2积分。");
        this.point-=score/2;
        checkState(score);
        System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");    }

    public void checkState(int score)
    {
        if(point<0)
        {
            System.out.println("余额不足,文件下载失败!");
            this.point+=score;
        }
        else if(point<=100)
        {
            acc.setState(new PrimaryState(this));
        }
        else if(point<=1000)
        {
            acc.setState(new MiddleState(this));
        }
    }
}
package State;

/**
 * Created by Jiqing on 2016/10/29.
 */
public class MiddleState extends AbstractState
{
    public MiddleState(AbstractState state)
    {
        this.acc=state.acc;
        this.point=state.getPoint();
        this.stateName="高手";
    }

    public void writeNote(int score)
    {
        System.out.println(acc.getName() + "发布留言" + ",增加" + score + "*2个积分。");
        this.point+=score*2;
        checkState(score);
        System.out.println("剩余积分为:" + this.point + ",当前级别为:" + acc.getState().stateName + "。");
    }

    public void checkState(int score)
    {
        if(point>=1000)
        {
            acc.setState(new HighState(this));
        }
        else if(point<0)
        {
            System.out.println("余额不足,文件下载失败!");
            this.point+=score;
        }
        else if(point<=100)
        {
            acc.setState(new PrimaryState(this));
        }
    }
}
package State;

/**
 * Created by Jiqing on 2016/10/29.
 */
public class PrimaryState extends AbstractState{
    public PrimaryState(AbstractState state)
    {
        this.acc=state.acc;
        this.point=state.getPoint();
        this.stateName="新手";
    }

    public PrimaryState(ForumAccount acc)
    {
        this.point=0;
        this.acc=acc;
        this.stateName="新手";
    }

    public void downloadFile(int score)
    {
        System.out.println("对不起," + acc.getName() + ",您没有下载文件的权限!");
    }

    public void checkState(int score)
    {
        if(point>=1000)
        {
            acc.setState(new HighState(this));
        }
        else if(point>=100)
        {
            acc.setState(new MiddleState(this));
        }
    }
}

4.客户端执行

package State;

/**
 * Created by Jiqing on 2016/10/29.
 */
public class Client
{
    public static void main(String args[])
    {
        ForumAccount account=new ForumAccount("张三");
        account.writeNote(20);
        System.out.println("--------------------------------------");
        account.downloadFile(20);
        System.out.println("--------------------------------------");
        account.replyNote(100);
        System.out.println("--------------------------------------");
        account.writeNote(40);
        System.out.println("--------------------------------------");
        account.downloadFile(80);
        System.out.println("--------------------------------------");
        account.downloadFile(150);
        System.out.println("--------------------------------------");
        account.writeNote(1000);
        System.out.println("--------------------------------------");
        account.downloadFile(80);
        System.out.println("--------------------------------------");
    }
}

执行结果:

张三注册成功!
---------------------------------------------
张三发布留言,增加20积分。
剩余积分为:20,当前级别为:新手。
--------------------------------------
对不起,张三,您没有下载文件的权限!
--------------------------------------
张三回复留言,增加100积分。
剩余积分为:120,当前级别为:高手。
--------------------------------------
张三发布留言,增加40*2个积分。
剩余积分为:200,当前级别为:高手。
--------------------------------------
张三下载文件,扣除80积分。
剩余积分为:120,当前级别为:高手。
--------------------------------------
张三下载文件,扣除150积分。
余额不足,文件下载失败!
剩余积分为:120,当前级别为:高手。
--------------------------------------
张三发布留言,增加1000*2个积分。
剩余积分为:2120,当前级别为:专家。
--------------------------------------
张三下载文件,扣除80/2积分。
剩余积分为:2080,当前级别为:专家。
--------------------------------------

看关系图

422101-20161029004004875-1048217948.png


本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/6009834.html,如需转载请自行联系原作者

相关文章
|
1月前
|
设计模式
【设计模式】状态模式
【设计模式】状态模式
|
3月前
|
设计模式 Java
聊聊Java设计模式-状态模式
状态模式(State Pattern)指允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
51 1
|
3月前
|
设计模式 存储 Java
聊聊Java设计模式-备忘录模式
备忘录模式(Memento Design Pattern),也叫快照(Snapshot)模式。指在不违背封装原则前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。
37 0
聊聊Java设计模式-备忘录模式
|
8月前
|
设计模式
设计模式-行为型模式:状态模式
设计模式-行为型模式:状态模式
|
4月前
行为型 状态模式
行为型 状态模式
17 0
|
6月前
|
设计模式
行为型设计模式04-状态模式
行为型设计模式04-状态模式
28 0
|
6月前
|
设计模式 C++ 开发者
设计模式之状态模式(C++)
设计模式之状态模式(C++)
|
9月前
|
设计模式
设计模式行为型-状态模式
设计模式行为型-状态模式
41 0
|
11月前
|
设计模式 消息中间件 Java
一起来学设计模式之状态模式
前言 目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~ 本节给大家讲一下设计模式中的状态模式,并结合实际业务场景给大家讲解如何使用~ 本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~ 状态模式 状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。 在状态模式中,一个对象的状态被封装为一个对象,该状态对象则负责对象的行为变化。当对象的状态改变时,它会使用当前状态所对应的行为。
|
设计模式
23种设计模式——状态模式
状态模式是对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
149 0
23种设计模式——状态模式

热门文章

最新文章