1.意圖
允許一個對象在其內部狀態改變的時候改變它的行爲,對象看起來似乎下修改了它的類
2.參與者
Context - 定義客戶感興趣的接口
- 維護一個ConcreteState子類的實例,這個實例定義當前狀態
State - 定義一個接口以封裝與context的一個特定狀態的行爲
ConcreteState - 每個子類實現一個與Context的一個狀態相關的行爲
3.結構
4.代碼
public interface State {
public int handle(Context c,int num);
}
public class ConcreteState implements State {
@Override
public int handle(Context c,int num) {
if(0<num && num<11){
return 20;
}else{
c.changeState(new ConcreteState2());
return c.request(num);
}
}
}
public class ConcreteState2 implements State {
@Override
public int handle(Context c,int num) {
if(10<num && num<21){
return 15;
}else{
c.changeState(new ConcreteState3());
return c.request(num);
}
}
}
public class ConcreteState3 implements State {
@Override
public int handle(Context c,int num) {
if(20<num && num<31){
return 10;
}else{
c.changeState(new ConcreteState4());
return c.request(num);
}
}
}
public class ConcreteState4 implements State {
@Override
public int handle(Context c,int num) {
return 5;
}
}
public class Context {
private State state;
/***
*
* @param state 根據不同的糖果數量定義價格 1-10 20塊 11-20 15塊 21-30 10塊 31 5塊
*/
Context(State state) {
this.state = state;
}
public void changeState(State state) {
this.state = state;
}
public int request(int num){
return state.handle(this,num);
}
}
public class Client {
public static void main(String[] args) {
Context c = new Context(new ConcreteState());
System.out.println(c.request(50));
}
}