狀態模式:允許對象在內部改變時改變它的行爲,對象看起來好像修改了它的類。
將狀態封裝成爲對立的類,並將動作委託給當前狀態的對象。
對象在運行過程中,會完全改變他的行爲,好像另一個對象一樣。
案例情景:
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元
總結:
狀態模式允許隨着狀態的改變,改變狀態的行爲。