国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java設(shè)計模式之狀態(tài)模式

這篇具有很好參考價值的文章主要介紹了java設(shè)計模式之狀態(tài)模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

狀態(tài)模式(State Pattern)

基本介紹

  1. 狀態(tài)模式:它主要是用來解決對象在多種狀態(tài)轉(zhuǎn)換時,需要對外輸出不同的行為的問題,狀態(tài)和行為是一一對應(yīng)的,狀態(tài)之間可以相互轉(zhuǎn)換。
  2. 當(dāng)一個對象的內(nèi)在狀態(tài)改變時,允許改變其行為,這個對象看起來像是改變了其類。

原理類圖

java設(shè)計模式之狀態(tài)模式,JAVA 設(shè)計模式,java,設(shè)計模式,狀態(tài)模式

說明:

  1. Context 類為環(huán)境角色,用于維護(hù)State實例,這個實例定義當(dāng)前狀態(tài)
  2. State是抽象狀態(tài)角色,定義一個接口封裝與Context的一個特點接口相關(guān)行為
  3. ConcreteState 具體的狀態(tài)角色,每個子類實現(xiàn)一個與Context的一個狀態(tài)相關(guān)行為

應(yīng)用實例

編寫一個程序完成App抽獎,具體要求如下:

  1. 假如沒菜價一個這個活動就要扣除50積分,中將概率是10%
  2. 獎品數(shù)量固定,抽完就不能抽獎。
  3. 活動有四個狀態(tài):可以抽獎,不能抽獎,發(fā)放獎品,和獎品領(lǐng)完。
  4. 活動的四個狀態(tài)轉(zhuǎn)換關(guān)系如圖:
    java設(shè)計模式之狀態(tài)模式,JAVA 設(shè)計模式,java,設(shè)計模式,狀態(tài)模式
思路分析
  1. 定義一個接口叫狀態(tài)接口,每個狀態(tài)都實現(xiàn)它。
  2. 接口有扣除積分,抽獎方法,發(fā)放獎品的方法。

類圖如下:
java設(shè)計模式之狀態(tài)模式,JAVA 設(shè)計模式,java,設(shè)計模式,狀態(tài)模式
代碼如下:

public interface State {

    // 扣除積分 - 50
    public void deductMoney();

    // 是否抽中獎品
    public boolean raffle();

    // 發(fā)放獎品
    public  void dispensePrize();

}
public class CanRaffleState implements State{

    RaffleActivity activity;

    public CanRaffleState(RaffleActivity activity) {
        this.activity = activity;
    }

    //已經(jīng)扣除了積分,不能再扣
    @Override
    public void deductMoney() {
        System.out.println("已經(jīng)扣取過了積分");
    }

    //可以抽獎, 抽完獎后,根據(jù)實際情況,改成新的狀態(tài)
    @Override
    public boolean raffle() {
        System.out.println("正在抽獎,請稍等!");
        Random r = new Random();
        int num = r.nextInt(10);
        // 10%中獎機(jī)會
        if(num == 0){
            // 改變活動狀態(tài)為發(fā)放獎品 context
            activity.setState(activity.getDispenseState());
            return true;
        }else{
            System.out.println("很遺憾沒有抽中獎品!");
            // 改變狀態(tài)為不能抽獎
            activity.setState(activity.getNoRafflleState());
            return false;
        }
    }
    // 不能發(fā)放獎品
    @Override
    public void dispensePrize() {
        System.out.println("沒中獎,不能發(fā)放獎品");
    }
}

public class NoRaffleState implements State{
    // 初始化時傳入活動引用,扣除積分后改變其狀態(tài)
    RaffleActivity activity;

    public NoRaffleState(RaffleActivity activity) {
        this.activity = activity;
    }

    // 當(dāng)前狀態(tài)可以扣積分 , 扣除后,將狀態(tài)設(shè)置成可以抽獎狀態(tài)
    @Override
    public void deductMoney() {
        System.out.println("扣除50積分成功,您可以抽獎了");
        activity.setState(activity.getCanRaffleState());
    }

    // 當(dāng)前狀態(tài)不能抽獎
    @Override
    public boolean raffle() {
        System.out.println("扣了積分才能抽獎喔!");
        return false;
    }

    // 當(dāng)前狀態(tài)不能發(fā)獎品
    @Override
    public void dispensePrize() {
        System.out.println("不能發(fā)放獎品");
    }
}
public class DispenseState implements State{
    // 初始化時傳入活動引用,發(fā)放獎品后改變其狀態(tài)
    RaffleActivity activity;

    public DispenseState(RaffleActivity activity) {
        this.activity = activity;
    }

    //

    @Override
    public void deductMoney() {
        System.out.println("不能扣除積分");
    }

    @Override
    public boolean raffle() {
        System.out.println("不能抽獎");
        return false;
    }

    //發(fā)放獎品
    @Override
    public void dispensePrize() {
        if(activity.getCount() > 0){
            System.out.println("恭喜中獎了");
            // 改變狀態(tài)為不能抽獎
            activity.setState(activity.getNoRafflleState());
        }else{
            System.out.println("很遺憾,獎品發(fā)送完了");
            // 改變狀態(tài)為獎品發(fā)送完畢, 后面我們就不可以抽獎
            activity.setState(activity.getDispensOutState());
            //System.out.println("抽獎活動結(jié)束");
            //System.exit(0);
        }
    }
}

public class DispenseOutState implements State{
    // 初始化時傳入活動引用
    RaffleActivity activity;

    public DispenseOutState(RaffleActivity activity) {
        this.activity = activity;
    }
    @Override
    public void deductMoney() {
        System.out.println("獎品發(fā)送完了,請下次再參加");
    }

    @Override
    public boolean raffle() {
        System.out.println("獎品發(fā)送完了,請下次再參加");
        return false;
    }

    @Override
    public void dispensePrize() {
        System.out.println("獎品發(fā)送完了,請下次再參加");
    }
}

public class RaffleActivity {
    // state 表示活動當(dāng)前的狀態(tài),是變化
    State state = null;
    // 獎品數(shù)量
    int count = 0;

    // 四個屬性,表示四種狀態(tài)
    State noRafflleState = new NoRaffleState(this);
    State canRaffleState = new CanRaffleState(this);

    State dispenseState =   new DispenseState(this);
    State dispensOutState = new DispenseOutState(this);

    //構(gòu)造器
    //1. 初始化當(dāng)前的狀態(tài)為 noRafflleState(即不能抽獎的狀態(tài))
    //2. 初始化獎品的數(shù)量
    public RaffleActivity( int count) {
        this.state = getNoRafflleState();
        this.count = count;
    }

    //扣分, 調(diào)用當(dāng)前狀態(tài)的 deductMoney
    public void debuctMoney(){
        state.deductMoney();
    }

    //抽獎
    public void raffle(){
        // 如果當(dāng)前的狀態(tài)是抽獎成功
        if(state.raffle()){
            //領(lǐng)取獎品
            state.dispensePrize();
        }

    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    //這里請大家注意,每領(lǐng)取一次獎品,count--
    public int getCount() {
        int curCount = count;
        count--;
        return curCount;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public State getNoRafflleState() {
        return noRafflleState;
    }

    public void setNoRafflleState(State noRafflleState) {
        this.noRafflleState = noRafflleState;
    }

    public State getCanRaffleState() {
        return canRaffleState;
    }

    public void setCanRaffleState(State canRaffleState) {
        this.canRaffleState = canRaffleState;
    }

    public State getDispenseState() {
        return dispenseState;
    }

    public void setDispenseState(State dispenseState) {
        this.dispenseState = dispenseState;
    }

    public State getDispensOutState() {
        return dispensOutState;
    }

    public void setDispensOutState(State dispensOutState) {
        this.dispensOutState = dispensOutState;
    }
}

注意事項

  1. 代碼有很強(qiáng)的可讀性。狀態(tài)模式將每個狀態(tài)的行為封裝到對應(yīng)的一個類中。
  2. 方便維護(hù)。將容易產(chǎn)生問題的if-else語句刪除了,如果把狀態(tài)的行為放到一個類中,沒調(diào)用方法時都要判斷當(dāng)前時什么狀態(tài),不但會產(chǎn)生很多if-else語句,而且容易出錯。
  3. 符合開閉原則,容易增刪狀態(tài)。
  4. 會產(chǎn)生很多類,每個狀態(tài)都要一個對應(yīng)的類,當(dāng)狀態(tài)過多時會產(chǎn)生很多類,加大維護(hù)難度。

應(yīng)用場景

當(dāng)一個事件或者狀態(tài)有很多種狀態(tài),狀態(tài)之間需要相互轉(zhuǎn)換,對不同的狀態(tài)要求有不同的行為的時候,可以考慮使用該模式。文章來源地址http://www.zghlxwxcb.cn/news/detail-829191.html

到了這里,關(guān)于java設(shè)計模式之狀態(tài)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Java 設(shè)計模式】行為型之狀態(tài)模式

    狀態(tài)模式(State Pattern)是一種行為型設(shè)計模式,用于通過將對象的行為封裝到不同的狀態(tài)類中,使得對象在不同的狀態(tài)下具有不同的行為。狀態(tài)模式允許對象在內(nèi)部狀態(tài)發(fā)生改變時改變其行為,而無需修改其代碼。在本文中,我們將深入研究Java中狀態(tài)模式的定義、結(jié)構(gòu)、使

    2024年01月24日
    瀏覽(24)
  • Java設(shè)計模式之行為型-狀態(tài)模式(UML類圖+案例分析)

    Java設(shè)計模式之行為型-狀態(tài)模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計 四、案例分析 五、總結(jié) 狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,對象看起來似乎修改了它的類,狀態(tài)模式主要解決的是當(dāng)控制一個對象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過于復(fù)雜時的情況,把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不

    2024年02月16日
    瀏覽(20)
  • 【設(shè)計模式——學(xué)習(xí)筆記】23種設(shè)計模式——狀態(tài)模式State(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實現(xiàn))

    【設(shè)計模式——學(xué)習(xí)筆記】23種設(shè)計模式——狀態(tài)模式State(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實現(xiàn))

    請編寫程序完成APP抽獎活動具體要求如下: 假如每參加一次這個活動要扣除用戶50積分,中獎概率是10% 獎品數(shù)量固定,抽完就不能抽獎 活動有四個狀態(tài): 可以抽獎、不能抽獎、發(fā)放獎品和獎品領(lǐng)完,活動的四個狀態(tài)轉(zhuǎn)換關(guān)系圖如下 一開始的狀態(tài)為“不能抽獎”,當(dāng)扣除50積分

    2024年02月12日
    瀏覽(29)
  • JAVA設(shè)計模式----原型設(shè)計模式

    JAVA設(shè)計模式----原型設(shè)計模式

    定義 :用原型實例指定創(chuàng)建對象的種類,并通過拷貝這些原型創(chuàng)建新的對象。 類型 :創(chuàng)建類模式 類圖 : 原型模式主要用于對象的復(fù)制,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個條件: 實現(xiàn)Cloneable接口。在java語言有一個Cloneable接口,它的作用只

    2024年02月13日
    瀏覽(27)
  • Java設(shè)計模式 (三) 代理設(shè)計模式

    什么是代理設(shè)計模式? 代理設(shè)計模式是一種結(jié)構(gòu)型設(shè)計模式,它允許創(chuàng)建一個代理對象,用于控制對其他對象的訪問。代理模式通常用于在訪問對象時添加一些附加操作,而不是直接訪問真實對象。代理模式可以在不改變原始類代碼的情況下,通過引入代理類來增強(qiáng)功能。 代

    2024年02月12日
    瀏覽(26)
  • 【設(shè)計模式】Java設(shè)計模式詳細(xì)講解

    一、概述 Java設(shè)計模式是Java程序設(shè)計中一種重要的最佳實踐,它提供了一種框架和結(jié)構(gòu),可以幫助開發(fā)者更好地理解和設(shè)計復(fù)雜的系統(tǒng)。設(shè)計模式不僅僅是一種語法規(guī)則,更是一種思想和方法論,它能夠幫助開發(fā)者更好地分析、設(shè)計和實現(xiàn)軟件系統(tǒng)。 設(shè)計模式的概念最早由

    2024年02月10日
    瀏覽(19)
  • 【Java】 Java設(shè)計模式

    白白胖胖,充滿希望~ Java工廠模式(Factory Pattern)是一種創(chuàng)建型設(shè)計模式,它提供了一種創(chuàng)建對象的最佳方式,而無需將對象的創(chuàng)建邏輯暴露給客戶端代碼。工廠模式通過定義一個工廠方法來創(chuàng)建對象,而客戶端只需要調(diào)用該工廠方法即可獲得所需對象,從而實現(xiàn)了對象的創(chuàng)

    2024年02月09日
    瀏覽(22)
  • Java設(shè)計模式 (一) 模板方法設(shè)計模式

    什么是模板方法設(shè)計模式? 模板方法設(shè)計模式是一種行為型設(shè)計模式,它定義了一個算法的骨架,并將一些步驟的具體實現(xiàn)延遲到子類中。模板方法模式可以幫助確保在算法的不同部分中保持一致性,同時也允許子類根據(jù)需要進(jìn)行具體實現(xiàn)。 模板方法模式的關(guān)鍵特點包括:

    2024年02月12日
    瀏覽(21)
  • Java設(shè)計模式-組合模式

    在軟件設(shè)計中,設(shè)計模式是一種被廣泛接受和應(yīng)用的經(jīng)驗總結(jié),旨在解決常見問題并提供可復(fù)用的解決方案。 組合模式是一種結(jié)構(gòu)型設(shè)計模式,它允許將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。這種模式能夠使客戶端以一致的方式處理單個對象和對象集合,將

    2024年02月06日
    瀏覽(27)
  • java設(shè)計模式---策略模式

    java設(shè)計模式---策略模式

    策略設(shè)計模式是一種行為設(shè)計模式。當(dāng)在處理一個業(yè)務(wù)時,有多種處理方式,并且需要再運(yùn)行時決定使哪一種具體實現(xiàn)時,就會使用策略模式。 策略模式的類圖: 在支付業(yè)務(wù)中,有三種付款方式,程序運(yùn)行時使用哪種方式由用戶選擇,根據(jù)用戶選擇執(zhí)行不同的邏輯。 首先,

    2024年02月10日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包