转载请注明出处:http://blog.youkuaiyun.com/droyon/article/details/8801887
状态模式:允许对象在内部改变时改变它的行为,对象看起来好像修改了它的类。
将状态封装成为对立的类,并将动作委托给当前状态的对象。
对象在运行过程中,会完全改变他的行为,好像另一个对象一样。
案例情景:
ATM机在我们的生活中随处可见,我们只需插入银行卡,输入密码,输入取款金额,取走现金。就ok了,方便了我们的生活。我们现在就来模拟这个过程,最后“拿钱走我”
1、State.java
public interface State {
public void takeCash();//取走现金
public void insertCard();//插入银行卡
public void inputPassword();//输入银行卡密码
public void inputCashCount(int num);//输入取款金额
}
2、InsertCardState.java
public class InsertCardState implements State{
ATMMachine mAtmMachine;
public InsertCardState(ATMMachine atm){
mAtmMachine = atm;
}
@Override
public void takeCash() {
System.out.println("请插入银行卡");
}
@Override
public void insertCard() {
System.out.println("正在插入银行卡");
mAtmMachine.setmState(mAtmMachine.getInputPasswordState());
}
@Override
public void inputCashCount(int num) {
System.out.println("请插入银行卡");
}
@Override
public void inputPassword() {
System.out.println("请插入银行卡");
}
}
3、InputPasswordState.java
public class InputPasswordState implements State{
ATMMachine mAtmMachine;
public InputPasswordState(ATMMachine atm){
mAtmMachine = atm;
}
@Override
public void takeCash() {
System.out.println("请输入银行卡密码");
}
@Override
public void insertCard() {
System.out.println("请输入银行卡密码");
}
@Override
public void inputCashCount(int num) {
System.out.println("请输入银行卡密码");
}
@Override
public void inputPassword() {
System.out.println("输入银行卡密码,正确");
mAtmMachine.setmState(mAtmMachine.getInputCashCountState());
}
}
4、InputCashCountState.java
public class InputCashCountState implements State{
ATMMachine mAtmMachine;
public InputCashCountState(ATMMachine atm){
mAtmMachine = atm;
}
@Override
public void takeCash() {
System.out.println("请输入取款金额");
}
@Override
public void insertCard() {
System.out.println("请输入取款金额");
}
@Override
public void inputCashCount(int num) {
System.out.println("已输入取款金额,正在出钞");
mAtmMachine.setCashCount(num);
mAtmMachine.setmState(mAtmMachine.getTakeCashState());
}
@Override
public void inputPassword() {
System.out.println("请输入取款金额");
}
}
5、TakeCashState.java
public class TakeCashState implements State{
ATMMachine mAtmMachine;
public TakeCashState(ATMMachine atm){
mAtmMachine = atm;
}
@Override
public void takeCash() {
System.out.println("钞票已出,请取走钞票"+mAtmMachine.getCashCount()+"元");
mAtmMachine.setmState(mAtmMachine.getInsertCardState());
}
@Override
public void insertCard() {
System.out.println("你已经插入银行卡,钱已出,请取走钱");
}
@Override
public void inputCashCount(int num) {
System.out.println("钱已出,请取走钱:");
}
@Override
public void inputPassword() {
System.out.println("钱已出,请取走钱");
}
}
6、ATMMachine.java
public class ATMMachine {
private State takeCashState;
private State insertCardState;
private State inputCashCountState;
private State inputPasswordState;
private State mState;
private int cashCount;
public ATMMachine(){
takeCashState = new TakeCashState(this);
insertCardState = new InsertCardState(this);
inputCashCountState = new InputCashCountState(this);
inputPasswordState = new InputPasswordState(this);
mState = insertCardState;
}
public void insertCard(){
mState.insertCard();
}
public void takeCash(){
mState.takeCash();
}
public void inputCashCount(int num){
mState.inputCashCount(num);
}
public void inputPassword(){
mState.inputPassword();
}
public State getTakeCashState() {
return takeCashState;
}
public State getInsertCardState() {
return insertCardState;
}
public State getInputCashCountState() {
return inputCashCountState;
}
public void setmState(State mState) {
this.mState = mState;
}
public State getInputPasswordState() {
return inputPasswordState;
}
public int getCashCount() {
return cashCount;
}
public void setCashCount(int cashCount) {
this.cashCount = cashCount;
}
}
7、Test.java
public class Test {
public static void main(String args[]){
ATMMachine atm = new ATMMachine();
System.out.println("拿钱走我");
atm.takeCash();//直接取钱走人,这不是抢吗?当然不行
System.out.println("------------------------------------");
System.out.println("想的太好了,怎么可能那,先需要插入银行卡");
atm.insertCard();
System.out.println("------------------------------------");
System.out.println("现在可以取钱走我了吧");
atm.takeCash();
System.out.println("------------------------------------");
System.out.println("想的还是太好了,需要输入密码");
atm.inputPassword();
System.out.println("------------------------------------");
System.out.println("现在可以拿钱走我了吧,等等,还需要输入多少钱");
atm.inputCashCount(2000);
System.out.println("------------------------------------");
System.out.println("现在可以拿钱走我了吧");
atm.takeCash();
}
}
输出结果:
拿钱走我
请插入银行卡
------------------------------------
想的太好了,怎么可能那,先需要插入银行卡
正在插入银行卡
------------------------------------
现在可以取钱走我了吧
请输入银行卡密码
------------------------------------
想的还是太好了,需要输入密码
输入银行卡密码,正确
------------------------------------
现在可以拿钱走我了吧,等等,还需要输入多少钱
已输入取款金额,正在出钞
------------------------------------
现在可以拿钱走我了吧
钞票已出,请取走钞票2000元
总结:
状态模式允许随着状态的改变,改变状态的行为。