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));
}
}