天天看點

設計模式練習(18)——狀态模式

狀态模式

一、題目:

某紙牌遊戲中,人物角色具有入門級(Primary),熟練級(Secondary),高手級(Professional)和骨灰級(Final)四種等級,角色的等級與積分相對應,遊戲勝利将增加積分,失敗則扣除積分,入門級具有最基本的遊戲功能play(),熟練級增加了遊戲勝利積分加倍功能doubleScore(),高手級在熟練級基礎上再增加換牌功能changeCards(),骨灰級在高手級基礎上再增加偷看他人的牌的功能peekCards(),使用狀态模式來設計系統

(1) 繪制狀态模式結構視圖

(2) 給出執行個體類圖并實作代碼

二、所用模式結構視圖:

設計模式練習(18)——狀态模式

三、執行個體類圖:

設計模式練習(18)——狀态模式

四、執行個體實作代碼:

(因為區分,是以在類的前面加了Gj19)

環境類-玩家實體類

package gjStatePattern;
/**
 * 玩家實體類
 * @author gong
 *
 */
public class Gj19Player {
    private Gj19AbstractLevel level;
    private String name;
    private boolean isSuccess;
    public Gj19Player(String name) {
        this.level=new Gj19PrimaryLevel(this);
        this.name = name;
    }
    public boolean isSuccess() {
        return isSuccess;
    }
    public void setSuccess(boolean isSuccess) {
        this.isSuccess = isSuccess;
    }
    public Gj19AbstractLevel getLevel() {
        return level;
    }
    public void setLevel(Gj19AbstractLevel level) {
        this.level = level;
    }
    public String getName() {
        return name;
    }
    public void play(int score){
        level.play(score);
    }
    public void doubleScore(int score){
        level.doubleScore(score);
    }
    public void changeCards(int score){
        level.changeCards(score);
    }
    public void peekCards(int score){
        level.peekCards(score);
    }
}
           

抽象狀态類

package gjStatePattern;
/**
 * 抽象狀态類
 * @author gong
 *
 */
public abstract class Gj19AbstractLevel {
    protected Gj19Player player;
    protected String stateName;
    protected int point;
    public abstract void checkState(int score);

    public int getPoint() {
        return point;
    }
    public void setPoint(int point) {
        this.point = point;
    }
    public String getStateName() {
        return stateName;
    }
    public void setStateName(String stateName) {
        this.stateName = stateName;
    }
    public void play(int score){
        System.out.println(player.getName()+"擁有"+this.point+"積分,開始玩紙牌遊戲");
        if(player.isSuccess()==true){
            this.point+=score;
        }
        else if(point>score&&player.isSuccess()==false){
            System.out.println("分數已經最低,不可以再扣分了");
        }
        else if(player.isSuccess()==false){
            this.point-=score;
        }
        System.out.println(player.isSuccess()==true?"你的牌打得忒好了,赢得一場比賽":"同志任需努力,輸了一場比賽");
        checkState(score);
        System.out.println("積分剩餘:"+this.point+",目前級别:"+player.getLevel().getStateName());
    }
    public void doubleScore(int score){
        System.out.println(player.getName()+"擁有"+this.point+"積分,遊戲勝利可以積分加倍");
        if(player.isSuccess()==true){
            this.point+=*score;
        }
        else if(point>score&&player.isSuccess()==false){
            System.out.println("分數已經最低,不可以再扣分了");
        }
        else if(player.isSuccess()==false){
            this.point-=score;
        }
        System.out.println(player.isSuccess()==true?"你的牌打得忒好了,赢得一場比賽":"同志任需努力,輸了一場比賽");
        checkState(score);
        System.out.println("積分剩餘:"+this.point+",目前級别:"+player.getLevel().getStateName());
    }
    public void changeCards(int score){
        System.out.println(player.getName()+"擁有"+this.point+"積分,可以和其他玩家換牌");
        if(player.isSuccess()==true){
            this.point+=score;
        }
        else if(point>score&&player.isSuccess()==false){
            System.out.println("分數已經最低,不可以再扣分了");
        }
        else if(player.isSuccess()==false){
            this.point-=score;
        }
        System.out.println(player.isSuccess()==true?"你的牌打得忒好了,赢得一場比賽":"同志任需努力,輸了一場比賽");
        checkState(score);
        System.out.println("積分剩餘:"+this.point+",目前級别:"+player.getLevel().getStateName());
    }
    public void peekCards(int score){
        System.out.println(player.getName()+"擁有"+this.point+"積分,可以偷看他人的牌");
        if(player.isSuccess()==true){
            this.point+=score;
        }
        else if(point>score&&player.isSuccess()==false){
            System.out.println("分數已經最低,不可以再扣分了");
        }
        else if(player.isSuccess()==false){
            this.point-=score;
        }
        System.out.println(player.isSuccess()==true?"你的牌打得忒好了,赢得一場比賽":"同志任需努力,輸了一場比賽");
        checkState(score);
        System.out.println("積分剩餘:"+this.point+",目前級别:"+player.getLevel().getStateName());
    }

}
           

具體狀态類

package gjStatePattern;
/**
 * 具體狀态類
 * @author gong
 *
 */
public class Gj19PrimaryLevel extends Gj19AbstractLevel {
    public Gj19PrimaryLevel(Gj19AbstractLevel level) {
        this.player=level.player;
        this.point=level.getPoint();
        this.stateName="入門級玩家";
    }
    public Gj19PrimaryLevel(Gj19Player player) {
        this.player=player;
        this.stateName="入門級玩家";
        this.point=;
    }
    public void doubleScore(int score){
        System.out.println("對不起"+player.getName()+",您沒有獲勝雙倍積分的權利");
    }
    @Override
    public void checkState(int score) {
        if(this.point>){
            player.setLevel(new Gj19FinalLevel(this));
        }
        else if(this.point>){
            player.setLevel(new Gj19ProfessionalLevel(this));
        }
        else if(this.point>){
            player.setLevel(new Gj19SecondaryLevel(this));
        }

    }

}
           

具體狀态類

package gjStatePattern;
/**
 * 具體狀态類
 * @author gong
 *
 */

public class Gj19SecondaryLevel extends Gj19AbstractLevel {
    public Gj19SecondaryLevel(Gj19AbstractLevel level) {
        this.player=level.player;
        this.point=level.getPoint();
        this.stateName="熟練級玩家";
    }
    public void changeCards(int score){
        System.out.println("對不起"+player.getName()+",您沒有換牌的權利");
    }
    public void peekCards(int score){
        System.out.println("對不起"+player.getName()+",您沒有偷看别人牌的權利");
    }
    @Override
    public void checkState(int score) {
        if(this.point>){
            player.setLevel(new Gj19FinalLevel(this));
        }
        else if(this.point>){
            player.setLevel(new Gj19ProfessionalLevel(this));
        }
        else if(this.point<){
            player.setLevel(new Gj19PrimaryLevel(this));
        }

    }

}
           

具體狀态類

package gjStatePattern;
/**
 * 具體狀态類
 * @author gong
 *
 */

public class Gj19ProfessionalLevel extends Gj19AbstractLevel {
    public Gj19ProfessionalLevel(Gj19AbstractLevel level) {
        this.player=level.player;
        this.point=level.getPoint();
        this.stateName="高手級玩家";
    }
    public void peekCards(int score){
        System.out.println("對不起"+player.getName()+",您沒有偷看别人牌的權利");
    }
    @Override
    public void checkState(int score) {
        if(this.point>){
            player.setLevel(new Gj19FinalLevel(this));
        }
        else if(this.point<){
            player.setLevel(new Gj19PrimaryLevel(this));
        }
        else if(this.point<){
            player.setLevel(new Gj19SecondaryLevel(this));
        }

    }

}
           

具體狀态類

package gjStatePattern;
/**
 * 具體狀态類
 * @author gong
 *
 */
public class Gj19FinalLevel extends Gj19AbstractLevel {
    public Gj19FinalLevel(Gj19AbstractLevel level) {
        this.player=level.player;
        this.point=level.getPoint();
        this.stateName="骨灰級玩家";
    }
    @Override
    public void checkState(int score) {
        if(this.point<){
            player.setLevel(new Gj19ProfessionalLevel(this));
        }
        else if(this.point<){
            player.setLevel(new Gj19SecondaryLevel(this));
        }
        else if(this.point<){
            player.setLevel(new Gj19PrimaryLevel(this));
        }

    }

}
           

狀态模式用戶端

package gjStatePattern;
/**
 * 狀态模式用戶端
 * @author gong
 *
 */
public class Gj19Client {

    public static void main(String[] args) {
        Gj19Player player1=new Gj19Player("周小妹");
        player1.setSuccess(true);
        player1.play();
        System.out.println("-----------------------------------------------");
        player1.setSuccess(true);
        player1.doubleScore();
        System.out.println("===============================================");
        player1.setSuccess(true);
        player1.play();
        System.out.println("===============================================");
        player1.setSuccess(true);
        player1.doubleScore();
        System.out.println("-----------------------------------------------");
        player1.setSuccess(true);
        player1.peekCards();
        System.out.println("===============================================");
        player1.setSuccess(true);
        player1.doubleScore();
        System.out.println("===============================================");
    }
}
           

五、運作結果:

設計模式練習(18)——狀态模式

繼續閱讀