状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。 |
● 环境类:环境类又称为上下文类,它是拥有多种状态的对象。由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出去形成单独的状态类。在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。
● 抽象状态类:它用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象状态类中。
● 具体状态类:它是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。
环境类:玩家
class Player { private String name; private Integer jf = 0; private playerstate ps; public Player(String name,Integer jf) { this.name = name; this.jf = jf; this.ps = new Primary(this); } public Integer getJf() { return jf; } public void setJf(Integer jf) { this.jf = jf; } public playerstate getPs() { return ps; } public void setPs(playerstate ps) { this.ps = ps; } }
抽象状态类
abstract class playerstate{ public playerstate(Player player) { this.player = player; } protected Player player; abstract void stateCheck(); public void victory(){ player.setJf(player.getJf() + 10); stateCheck(); } public void failure(){ player.setJf(player.getJf() - 10); stateCheck(); } public void doubleScore(){ System.out.println("没有积分加倍"); } public void changeCards(){ System.out.println("没有换牌功能"); } }
具体状态类
class Primary extends playerstate{ public Primary(Player player) { super(player); } public void play(){ System.out.println("基本游戏功能"); } @Override void stateCheck() { if(player.getJf()>10){ player.setPs(new Secondary(player)); } } }
class Secondary extends playerstate{ public Secondary(Player player) { super(player); } public void play(){ System.out.println("基本游戏功能"); } @Override public void doubleScore(){ System.out.println("游戏积分加倍"); } @Override void stateCheck() { if(player.getJf()>20){ player.setPs(new Professional(player)); }else if(player.getJf()<=10){ player.setPs(new Primary(player)); } } }
class Professional extends playerstate{ public Professional(Player player) { super(player); } public void play(){ System.out.println("基本游戏功能"); } @Override public void doubleScore(){ System.out.println("游戏积分加倍"); } @Override public void changeCards(){ System.out.println("换牌功能"); } @Override void stateCheck() { if(player.getJf()<=20){ player.setPs(new Secondary(player)); } } }
main
class main{ public static void main(String[] args) { Player pl1 = new Player("p1",0); pl1.getPs().victory(); System.out.println(pl1.getPs() + pl1.getJf().toString()); pl1.getPs().doubleScore(); pl1.getPs().victory(); System.out.println(pl1.getPs() + pl1.getJf().toString()); pl1.getPs().doubleScore(); pl1.getPs().victory(); System.out.println(pl1.getPs() + pl1.getJf().toString()); pl1.getPs().failure(); System.out.println(pl1.getPs() + pl1.getJf().toString()); pl1.getPs().failure(); System.out.println(pl1.getPs() + pl1.getJf().toString()); } }