状态模式:允许对象在内部改变时改变它的行为,对象看起来好像修改了它的类。
将状态封装成为对立的类,并将动作委托给当前状态的对象。
对象在运行过程中,会完全改变他的行为,好像另一个对象一样。
案例情景:
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元
总结:
状态模式允许随着状态的改变,改变状态的行为。