<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">在此,我不解释什么叫状态模式了,大家可以去网上搜一下。</span>
我想说一下状态模式中,不同情景下如何具体设计的问题。
一、 对于动作中不需要涉及到状态的切换的,例如我们定位的动作中,“定位”这一动作并不会引起状态改变。
文件目录:
抽象类State的代码:
package com.anvien.practice.state_common;
public abstract class State {
protected Direction dir;
/** 识别方向 */
public abstract void orientate(Person p);
public Direction getDir() {
return dir;
}
public void setDir(Direction dir) {
this.dir = dir;
}
}
具体实现:东部方向:
package com.anvien.practice.state_common;
public class EastState extends State{
@Override
public void orientate(Person p) {
if(p.getState().getDir() == Direction.EAST)
{
System.out.println("you are at the east direction");
}
else
{
p.setState(new SouthState());
}
}
}
南部方向:
package com.anvien.practice.state_common;
public class SouthState extends State{
@Override
public void orientate(Person p) {
if(p.getState().getDir() == Direction.SOUTH)
{
System.out.println("you are at the south direction");
}
else
{
p.setState(new WestState());
}
}
}
西部和北部同理,不过最后一个北部方向需要注意下:
package com.anvien.practice.state_common;
public class NorthState extends State{
@Override
public void orientate(Person p) {
if(p.getState().getDir() == Direction.NORTH)
{
System.out.println("you are at the north direction");
}
else
{
<strong>System.out.println("unknown direction"); // 最好实现状态链不循环出现</strong>
}
}
}
package com.anvien.practice.state_common;
public class Person {
State state;
public Person(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void orientate()
{
this.state.orientate(this);
}
}
package com.anvien.practice.state_common;
public class Main {
public static void main(String[] args)
{
State state = new SouthState();
state.setDir(Direction.SOUTH);
new Person(state).orientate();
}
}
输出:
you are at the south direction