您的位置:首页 > 编程语言 > Java开发

一个简单的有限状态机例子

2016-03-06 15:06 417 查看
public class Test {

public static void main(String[] args) {
final long money = 600000L;
final int preMoney = (int)money;
final int loanYears = 30;
final int everyMonthMoney = 2000;

final BuyHouseStateMachine.Prepare prepare = BuyHouseStateMachine.Prepare.prepare()
.carriedMoney(money)
.preMoney(preMoney)
.loanYears(loanYears)
.everyMonthMoney(everyMonthMoney)
.build();
final BuyHouseStateMachine machine = new BuyHouseStateMachine(prepare);

machine.start();
}

static final class BuyHouseStateMachine {
public static final class Prepare {
private long mCarriedMoney; // 带来的买房钱
private int mPreMoney;      // 首付的钱
private int mLoanYears;	   // 贷款年限
private int mEveryMonthMoney; // 每个月需要还的钱

public long carriedMoney() {
return mCarriedMoney;
}

public int preMoney() {
return mPreMoney;
}

public int loanYears() {
return mLoanYears;
}

public int everyMonthMoney() {
return mEveryMonthMoney;
}

private Prepare(){}

public static Builder prepare() {
return new Prepare.Builder();
}

private static final class Builder {
private Prepare prepare;
public Builder() {
prepare = new Prepare();
}

public Prepare build() {
return prepare;
}

public Builder carriedMoney(long carriedMoney) {
prepare.mCarriedMoney = carriedMoney;
return this;
}

public Builder preMoney(int preMoney) {
prepare.mPreMoney = preMoney;
return this;
}

public Builder loanYears(int loanYears) {
prepare.mLoanYears = loanYears;
return this;
}

public Builder everyMonthMoney(int everyMonthMoney) {
prepare.mEveryMonthMoney = everyMonthMoney;
return this;
}
}

public Prepare(long carriedMoney,int preMoney,int loanYears) {
mCarriedMoney = carriedMoney;
mPreMoney = preMoney;
mLoanYears = loanYears;
}
}

private final Prepare mPrepare;

public BuyHouseStateMachine(Prepare prepare) {
mPrepare = prepare;
}

public void start() {
final MiddleCompanyState middleCompany = new MiddleCompanyState(mPrepare);
middleCompany.next();
}
}

static interface IBuyHouseState {
long HOUSE_PRICE = 1000000L;
long ENOUGH_MONEY = 1000000L;

int _30_PERCENT = 300000;
int _20_PERCENT = 200000;
}

static abstract class AbstractBuyHouseState implements IBuyHouseState {
protected BuyHouseStateMachine.Prepare mPrepare;
protected AbstractBuyHouseState mLastState;

public void setLastState(AbstractBuyHouseState lastState) {
mLastState = lastState;
}

public AbstractBuyHouseState(BuyHouseStateMachine.Prepare prepare) {
mPrepare = prepare;
}

public void next() {
final AbstractBuyHouseState nextState = getNextState();
nextState.start();
}

public void start() {
}

protected abstract AbstractBuyHouseState getNextState();
}

static final class MiddleCompanyState extends AbstractBuyHouseState {
public MiddleCompanyState(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

protected AbstractBuyHouseState getNextState() {
if (mPrepare.carriedMoney() > HOUSE_PRICE)
return new BuyHouseSuccessState(mPrepare); // 一次性付清
return new LoanState(mPrepare); // 需要贷款买房
}
}

static final class BuyHouseSuccessState extends AbstractBuyHouseState {
public BuyHouseSuccessState(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {
return this;
}

public void start() {
System.out.println("终于可以买房子了!");
}
}

static final class LoanState extends AbstractBuyHouseState {
public LoanState(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {
if (mPrepare.preMoney() > _30_PERCENT)
return new _30_Percent_state(mPrepare);
else if (mPrepare.preMoney() > _20_PERCENT)
return new _20_Percent_state(mPrepare);
return new BuyHouseFailedState(mPrepare);
}

public void start() {
System.out.println("您只带了 " + mPrepare.carriedMoney() + "元,房子价格为: " + HOUSE_PRICE + "元,需要贷款才能买房");
next();
}
}

static final class _30_Percent_state extends AbstractBuyHouseState {
public _30_Percent_state(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {
if (mPrepare.loanYears() == 30) {
final AbstractBuyHouseState result = new _30_Years_State(mPrepare);
result.setLastState(this);
return result;
} else if (mPrepare.loanYears() == 20) {
final AbstractBuyHouseState result = new _20_Year_State(mPrepare);
result.setLastState(this);
return result;
}

return new BuyHouseFailedState(mPrepare);
}

public void start() {
System.out.println("您的首付准备了: " + mPrepare.preMoney() + "元,而首付只需要: " + _30_PERCENT + "元, 足够付三成首付");
next();
}
}

static final class _30_Years_State extends AbstractBuyHouseState {
public _30_Years_State(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {
if (mLastState != null) {
if (mLastState instanceof _30_Percent_state)
return new _3000_Money_Month(mPrepare);
else if (mLastState instanceof _20_Percent_state)
return new _5000_Money_Month(mPrepare);
}

return new BuyHouseFailedState(mPrepare);
}

public void start() {
System.out.println("您计划贷款30年...");
next();
}
}

static final class _3000_Money_Month extends AbstractBuyHouseState {
public _3000_Money_Month(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {

if (mPrepare.everyMonthMoney() > 3000)
return new BuyHouseSuccessState(mPrepare);

return new BuyHouseFailedState(mPrepare);
}

public void start() {
System.out.println("您需要每个月还贷3000元,而您计划每个月还贷" + mPrepare.everyMonthMoney() + "元");
next();
}
}

static final class _4000_Money_Month extends AbstractBuyHouseState {
public _4000_Money_Month(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {

if (mPrepare.everyMonthMoney() > 4000)
return new BuyHouseSuccessState(mPrepare);

return new BuyHouseFailedState(mPrepare);
}

public void start() {
System.out.println("每个月还贷4000元");
next();
}
}

static final class _5000_Money_Month extends AbstractBuyHouseState {
public _5000_Money_Month(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {
if (mPrepare.everyMonthMoney() > 5000)
return new BuyHouseSuccessState(mPrepare);

return new BuyHouseFailedState(mPrepare);
}

public void start() {
System.out.println("每个月还贷5000元");
next();
}
}

static final class _6000_Money_Month extends AbstractBuyHouseState {
public _6000_Money_Month(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {
if (mPrepare.everyMonthMoney() > 6000)
return new BuyHouseSuccessState(mPrepare);

return new BuyHouseFailedState(mPrepare);
}

public void start() {
System.out.println("每个月还贷6000元");
next();
}
}

static final class _20_Year_State extends AbstractBuyHouseState {
public _20_Year_State(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {
if (mLastState != null) {
if (mLastState instanceof _30_Percent_state)
return new _4000_Money_Month(mPrepare);
else if (mLastState instanceof _20_Percent_state)
return new _6000_Money_Month(mPrepare);
}

return new BuyHouseFailedState(mPrepare);
}

public void start() {
System.out.println("贷款20年");
next();
}
}

static final class _20_Percent_state extends AbstractBuyHouseState {
public _20_Percent_state(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {
if (mPrepare.loanYears() == 30) {
final AbstractBuyHouseState result = new _30_Years_State(mPrepare);
result.setLastState(this);
return result;
}else if (mPrepare.loanYears() == 20) {
final AbstractBuyHouseState result = new _20_Year_State(mPrepare);
result.setLastState(this);
return result;
}

return new BuyHouseFailedState(mPrepare);
}

public void start() {
System.out.println("付两成首付");
next();
}
}

static final class BuyHouseFailedState extends AbstractBuyHouseState {
public BuyHouseFailedState(BuyHouseStateMachine.Prepare prepare) {
super(prepare);
}

public AbstractBuyHouseState getNextState() {
return this;
}

public void start() {
System.out.println("哎,买不起房子!");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 有限状态机