一箫攀、浩言
人靜而后安,安而能后定幼衰,定而能后慧靴跛,慧而能后悟,悟而能后得渡嚣。
二梢睛、背景
開年,看了看最近網(wǎng)上傳的《阿里巴巴Java開發(fā)規(guī)范》,然后看到了如下一部分识椰。
這里說如果if else if else超過了三層就需要使用狀態(tài)設(shè)計模式扬绪。碰巧年前我寫了一個訂單狀態(tài)轉(zhuǎn)換的代碼,我沒有使用if else if else的形式裤唠,我使用了case,如果改為if等 就是if else if else形式了毅整。
所以我就在思考他嚷,這段代碼是否可以改為所說的狀態(tài)設(shè)計模式了?
三、狀態(tài)設(shè)計模式
3.1狀態(tài)模式定義:
狀態(tài)模式是屬于行為模式的范疇渗钉,即是對象在內(nèi)部狀態(tài)改變時改變它的行為航瞭,對象看起來好像修改了它的類诫硕。
下圖是截取《Head First 設(shè)計模式》中的圖片
所以我上圖code.png圖片中,是沒有對象狀態(tài)變化或者行為的操作的刊侯。所以多層的if else if else也是要根據(jù)實(shí)際的代碼問題來做處理章办。下面上《Head First 設(shè)計模式》中的代碼如下
3.2 code代碼案例
State狀態(tài)類
package com.mouse.design.state;
/**
* Created by wuhao on 2017/2/7.
*/
public interface State {
public void insertQuarter();
public void ejectQuarter();
public void turnCrank();
public void dispense();
}
package com.mouse.design.state;
/**
* Created by wuhao on 2017/2/7.
*/
public class GumballMachine {
State hasQuarterState;
State noQuarterState;
State soldOutState;
State soldState;
State winnerState;
State state = soldOutState;
int count = 0;
public GumballMachine(int numberCount) {
this.count = numberCount;
hasQuarterState = new HasQuarterState(this);
noQuarterState = new NoQuarterState(this);
soldOutState = new SoldOutState(this);
soldState = new SoldState(this);
winnerState = new WinnerState(this);
if (numberCount > 0) {
state = noQuarterState;
}
}
/**
* 投幣
*/
public void insertQuarter() {
state.insertQuarter();
}
/**
* 退還硬幣
*/
public void ejectQuarter() {
state.ejectQuarter();
}
/**
* 轉(zhuǎn)動轉(zhuǎn)軸
*/
public void turnCrank() {
state.turnCrank();
state.dispense();
}
void setState(State state) {
this.state = state;
}
/**
* 釋放糖果并且糖果數(shù)減1;
*/
void releaseBall() {
System.out.println("a gumball comes rolling out the slot");
if (count != 0) {
count = count - 1;
}
}
public State getHasQuarterState() {
return hasQuarterState;
}
public void setHasQuarterState(State hasQuarterState) {
this.hasQuarterState = hasQuarterState;
}
public State getNoQuarterState() {
return noQuarterState;
}
public void setNoQuarterState(State noQuarterState) {
this.noQuarterState = noQuarterState;
}
public State getSoldOutState() {
return soldOutState;
}
public void setSoldOutState(State soldOutState) {
this.soldOutState = soldOutState;
}
public State getSoldState() {
return soldState;
}
public void setSoldState(State soldState) {
this.soldState = soldState;
}
public State getWinnerState() {
return winnerState;
}
public void setWinnerState(State winnerState) {
this.winnerState = winnerState;
}
public State getState() {
return state;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
HasQuarterState類
package com.mouse.design.state;
import java.util.Random;
/**
* Created by wuhao on 2017/2/7.
*/
public class HasQuarterState implements State {
GumballMachine gumballMachine;
public HasQuarterState(GumballMachine gumballMachine) {
this.gumballMachine = gumballMachine;
}
@Override
public void insertQuarter() {
System.out.println("你不能重復(fù)投幣");
}
@Override
public void ejectQuarter() {
System.out.println("退還投入的硬幣!1醭埂藕届!");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
@Override
public void turnCrank() {
System.out.println("you turn...");
int win = new Random().nextInt(10);
System.out.println("win--->"+win);
if( (0 == win) && gumballMachine.getCount() > 0 ){
gumballMachine.setState(gumballMachine.getWinnerState());
}else{
gumballMachine.setState(gumballMachine.getSoldState());
}
}
@Override
public void dispense() {
System.out.println("No gumball dispensed...");
}
}
client.java類
package com.mouse.design.state;
/**
* Created by wuhao on 2017/2/7.
*/
public class Client {
public static void main(String[] args) {
GumballMachine gumballMachine = new GumballMachine(5);
System.out.println("---------1--------");
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println("--------2-----");
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println("------3-------");
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println("------4-------");
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println("------5-------");
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
System.out.println("------6-------");
gumballMachine.insertQuarter();
gumballMachine.turnCrank();
}
}
3.3 代碼
代碼已經(jīng)上傳到github上了,之前一直用bitbucket亭饵,不過現(xiàn)在把一些代碼弄到github上休偶。
https://github.com/MahoneWu/mouse-java-git.git
四:思考
最近看那個規(guī)范,覺得對于我來說還是有很大很大幫助的辜羊,其中的一些東西注意項(xiàng)踏兜,有說到需要注意的設(shè)計模式,比如"模板設(shè)計模式"八秃,這篇寫的"狀態(tài)設(shè)計模式"碱妆,其實(shí)設(shè)計模式在思維上是很特別的,寫法也是昔驱。所以狀態(tài)設(shè)計模式一般用于"狀態(tài)的變化并且業(yè)務(wù)復(fù)雜的"疹尾。
近期了把去年沒寫完的幾篇文章陸續(xù)發(fā)了,還有很早寫的兩篇比較簡單的設(shè)計模式的文章舍悯。都是簡單的記載下了航棱。并且所有的測試代碼都會放到github上面了。
五:浩語
__
__ _ ____ __| |__ _____ ___
\ \/ \/ / | \ | \\__ \ / _ \
\ /| | / Y \/ __ \( <_> )
\/\_/ |____/|___| (____ /\____/
\/ \/
任何事情都是要靠努力和用心萌衬。