您当前的位置: 首页 > 

命运之手

暂无认证

  • 1浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【设计模式】【23】状态模式

命运之手 发布时间:2022-05-02 16:58:36 ,浏览量:1

使用场景

状态模式,英文名State Pattern

该模式根据对象状态来决定对象行为,由State来决定行为,而不是Context自身

这种设计模式的目的在于,将与状态切换相关的工作,交给State自己处理,Context只关心自身的其它业务

根据业务复杂程度,该模式可以有简单和复杂两种实现方式

  • 简单模式下,每个状态之间是独立的,每个State对象直接处理当前状态下的工作即可,不需要考虑旧状态
  • 复杂模式下,多个状态之间是有关联的,从旧状态切换到新状态,需要做一些额外的切换工作,并且不同状态之间的切换工作可能是完全不同的

代码实现 - 简单模式


	abstract public class State {
	
	    public static final State STATE_A = new StateA();
	    public static final State STATE_B = new StateB();
	
	    Context context;
	
	    abstract public void work();
	}
	
	public class StateA extends State {
	
	    @Override
	    public void work() {
	        System.out.print("Apply State A and Work as Role A");
	    }
	}
	
	public class StateB extends State {
	
	    @Override
	    public void work() {
	        System.out.print("Apply State B and Work as Role B");
	    }
	}


	public class Context {
	
	    State currentState;
	
	    public void applyStateAndWork(State state) {
	        currentState = state;
	        currentState.context = this;
	        currentState.work();
	    }
	}


	public class APP {
	
	    public static void main(String... args) {
	        Context ctx = new Context();
	        ctx.applyStateAndWork(State.STATE_A);
	        ctx.applyStateAndWork(State.STATE_B);
	    }
	}

代码实现 - 复杂模式


	abstract public class State {
	
	    public static final State STATE_A = new StateA();
	    public static final State STATE_B = new StateB();
	
	    Context context;
	
	    public void setContext(Context context) {
	        this.context = context;
	    }
	
	    abstract public void workAsRoleA();
	
	    abstract public void workAsRoleB();
	}
	
	public class StateA extends State {
	
	    @Override
	    public void workAsRoleA() {
	        System.out.print("Apply State A and Work as Role A");
	    }
	
	    @Override
	    public void workAsRoleB() {
	        context.currentState = State.STATE_B;
	        context.workAsRoleB();
	    }
	}
	
	public class StateB extends State {
	
	    @Override
	    public void workAsRoleA() {
	        context.currentState = State.STATE_A;
	        context.workAsRoleA();
	    }
	
	    @Override
	    public void workAsRoleB() {
	        System.out.print("Apply State B and Work as Role B");
	    }
	}


	public class Context {
	
	    State currentState = State.STATE_A;
	
	    public void workAsRoleA() {
	        currentState.setContext(this);
	        currentState.workAsRoleA();
	    }
	
	    public void workAsRoleB() {
	        currentState.setContext(this);
	        currentState.workAsRoleB();
	    }
	}


	public class APP {
	
	    public static void main(String... args) {
	        Context ctx = new Context();
	        ctx.workAsRoleA();
	        ctx.workAsRoleB();
	        ctx.workAsRoleA();
	    }
	}

关注
打赏
1654938663
查看更多评论
立即登录/注册

微信扫码登录

0.0428s