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

狀態(tài)模式——對(duì)象狀態(tài)及其轉(zhuǎn)換

這篇具有很好參考價(jià)值的文章主要介紹了狀態(tài)模式——對(duì)象狀態(tài)及其轉(zhuǎn)換。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、簡(jiǎn)介

1.1、概述

在軟件系統(tǒng)中,有些對(duì)象也像水一樣具有多種狀態(tài),這些狀態(tài)在某些情況下能夠相互轉(zhuǎn)換,而且對(duì)象在不同的狀態(tài)下也將具有不同的行為。為了更好地對(duì)這些具有多種狀態(tài)的對(duì)象進(jìn)行設(shè)計(jì),可以使用一種被稱(chēng)為狀態(tài)模式的設(shè)計(jì)模式。

狀態(tài)模式用于解決系統(tǒng)中復(fù)雜對(duì)象的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下行為的封裝問(wèn)題。當(dāng)系統(tǒng)中某個(gè)對(duì)象存在多個(gè)狀態(tài),這些狀態(tài)之間可以進(jìn)行轉(zhuǎn)換,而且對(duì)象在不同狀態(tài)下行為不相同時(shí)可以使用狀態(tài)模式。狀態(tài)模式將一個(gè)對(duì)象的狀態(tài)從該對(duì)象中分離出來(lái),封裝到專(zhuān)門(mén)的狀態(tài)類(lèi)中,使得對(duì)象狀態(tài)可以靈活變化。對(duì)于客戶(hù)端而言,無(wú)須關(guān)心對(duì)象狀態(tài)的轉(zhuǎn)換以及對(duì)象所處的當(dāng)前狀態(tài),無(wú)論對(duì)于何種狀態(tài)的對(duì)象,客戶(hù)端都可以一致性地處理。

1.2、定義

狀態(tài)模式(State Pattern):允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來(lái)似乎修改了它的類(lèi)。其別名為狀態(tài)對(duì)象(Objects for States),狀態(tài)模式是一種對(duì)象行為型模式。

2、解析

2.1、UML類(lèi)圖

在狀態(tài)模式中引入了抽象狀態(tài)類(lèi)和具體狀態(tài)類(lèi),它們是狀態(tài)模式的核心,其結(jié)構(gòu)如下圖所示。
狀態(tài)模式——對(duì)象狀態(tài)及其轉(zhuǎn)換,設(shè)計(jì)模式,狀態(tài)模式
可以看出,在狀態(tài)模式結(jié)構(gòu)圖中包含以下3個(gè)角色:

  1. Context(環(huán)境類(lèi)):環(huán)境類(lèi)又稱(chēng)為上下文類(lèi),它是擁有多種狀態(tài)的對(duì)象。由于環(huán)境類(lèi)的狀態(tài)存在多樣性且在不同狀態(tài)下對(duì)象的行為有所不同,因此將狀態(tài)獨(dú)立出去形成單獨(dú)的狀態(tài)類(lèi)。在環(huán)境類(lèi)中維護(hù)一個(gè)抽象狀態(tài)類(lèi)State的實(shí)例,這個(gè)實(shí)例定義當(dāng)前狀態(tài),在具體實(shí)現(xiàn)時(shí),它是一個(gè)State子類(lèi)的對(duì)象。
  2. State(抽象狀態(tài)類(lèi)):它用于定義一個(gè)接口以封裝與環(huán)境類(lèi)的一個(gè)特定狀態(tài)相關(guān)的行為。在抽象狀態(tài)類(lèi)中聲明各種不同狀態(tài)對(duì)應(yīng)的方法,而在其子類(lèi)中實(shí)現(xiàn)這些方法。由于不同狀態(tài)下對(duì)象的行為可能不同,因此在不同子類(lèi)中方法的實(shí)現(xiàn)可能存在不同,相同的方法可以寫(xiě)在抽象狀態(tài)類(lèi)中。
  3. ConcreteState(具體狀態(tài)類(lèi)):它是抽象狀態(tài)類(lèi)的子類(lèi),每個(gè)子類(lèi)實(shí)現(xiàn)一個(gè)與環(huán)境類(lèi)的一個(gè)狀態(tài)相關(guān)的行為。每個(gè)具體狀態(tài)類(lèi)對(duì)應(yīng)環(huán)境類(lèi)的一個(gè)具體狀態(tài),不同的具體狀態(tài)類(lèi)其行為有所不同。

2.2、代碼示例

在狀態(tài)模式中,將對(duì)象在不同狀態(tài)下的行為封裝到不同的狀態(tài)類(lèi)中。為了讓系統(tǒng)具有更好的靈活性和可擴(kuò)展性,同時(shí)對(duì)各狀態(tài)下的共有行為進(jìn)行封裝,需要對(duì)狀態(tài)進(jìn)行抽象,引入了抽象狀態(tài)類(lèi)角色,其典型代碼如下:

/**
 * @Description: 抽象狀態(tài)
 * @Author: yangyongbing
 * @CreateTime: 2023/08/03
 * @Version: 1.0
 */
abstract class State {
    // 聲明抽象業(yè)務(wù)方法,不同的具體狀態(tài)類(lèi)可以有不同的方法實(shí)現(xiàn)
    public abstract void handle();
}

在抽象狀態(tài)類(lèi)的子類(lèi)即具體狀態(tài)類(lèi)中實(shí)現(xiàn)了在抽象狀態(tài)類(lèi)中聲明的業(yè)務(wù)方法,不同的具體狀態(tài)類(lèi)可以提供完全不同的方法實(shí)現(xiàn)。在實(shí)際使用時(shí),一個(gè)狀態(tài)類(lèi)中可能包含多個(gè)業(yè)務(wù)方法。如果在具體狀態(tài)類(lèi)中某些業(yè)務(wù)方法的實(shí)現(xiàn)完全相同,可以將這些方法移至抽象狀態(tài)類(lèi),實(shí)現(xiàn)代碼的復(fù)用。典型的具體狀態(tài)類(lèi)代碼如下:

/**
 * @Description: 具體狀態(tài)
 * @Author: yangyongbing
 * @CreateTime: 2023/08/03  19:45
 * @Version: 1.0
 */
public class ConcreteState extends State{
    @Override
    public void handle() {
        // 方法具體實(shí)現(xiàn)
    }
}

環(huán)境類(lèi)維持一個(gè)對(duì)抽象狀態(tài)類(lèi)的引用。通過(guò)setState()方法可以向環(huán)境類(lèi)注入不同的狀態(tài)對(duì)象,再在環(huán)境類(lèi)的業(yè)務(wù)方法中調(diào)用狀態(tài)對(duì)象的方法,典型代碼如下:

/**
 * @Description: 環(huán)境類(lèi)
 * @Author: yangyongbing
 * @CreateTime: 2023/08/03  19:46
 * @Version: 1.0
 */
public class Context {
    // 持有一個(gè)對(duì)抽象狀態(tài)對(duì)象的引用
    private State state;
    // 其它屬性值,該屬性值的變化可能會(huì)導(dǎo)致對(duì)象狀態(tài)發(fā)生變化
    private int value;

    // 設(shè)置狀態(tài)對(duì)象
    public void setState(State state) {
        this.state = state;
    }

    public void request(){
        // 其它代碼
        state.handle(); // 調(diào)用狀態(tài)對(duì)象的業(yè)務(wù)方法
        // 其他代碼
    }
}

環(huán)境類(lèi)實(shí)際上是真正擁有狀態(tài)的對(duì)象,這里只是將環(huán)境類(lèi)中與狀態(tài)有關(guān)的代碼提取出來(lái)封裝到專(zhuān)門(mén)的狀態(tài)類(lèi)中。

在狀態(tài)模式的使用過(guò)程中,一個(gè)對(duì)象的狀態(tài)之間還可以進(jìn)行相互轉(zhuǎn)換。通常有以下兩種實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換的方式:

  1. 統(tǒng)一由環(huán)境類(lèi)來(lái)負(fù)責(zé)狀態(tài)之間的轉(zhuǎn)換。此時(shí),環(huán)境類(lèi)還充當(dāng)了狀態(tài)管理器(State Manager)角色。在環(huán)境類(lèi)的業(yè)務(wù)方法中通過(guò)對(duì)某些屬性值的判斷實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換,還可以提供一個(gè)專(zhuān)門(mén)的方法用于實(shí)現(xiàn)屬性判斷和狀態(tài)轉(zhuǎn)換。代碼片段如下:
public void changeState(){
   // 判斷屬性值,根據(jù)屬性值進(jìn)行狀態(tài)轉(zhuǎn)換
   if(value==0){
      this.setState(new ConcreteStateA());
   }else if(value==1){
       this.setState(new ConcreteStateB());
   }
}
  1. 由具體狀態(tài)類(lèi)來(lái)負(fù)責(zé)狀態(tài)之間的轉(zhuǎn)換??梢栽诰唧w狀態(tài)類(lèi)的業(yè)務(wù)方法中判斷環(huán)境類(lèi)的某些屬性值再根據(jù)情況為環(huán)境類(lèi)設(shè)置新的狀態(tài)對(duì)象,實(shí)現(xiàn)狀態(tài)轉(zhuǎn)換。同樣,也可以提供一個(gè)專(zhuān)門(mén)的方法來(lái)負(fù)責(zé)屬性值的判斷和狀態(tài)轉(zhuǎn)換。此時(shí),狀態(tài)類(lèi)與環(huán)境類(lèi)之間將存在依賴(lài)或關(guān)聯(lián)關(guān)系,因?yàn)闋顟B(tài)類(lèi)需要訪問(wèn)環(huán)境類(lèi)中的屬性值。代碼片段如下:
public void changeState(Context ctx){
   // 判斷屬性值,根據(jù)屬性值進(jìn)行狀態(tài)轉(zhuǎn)換
   if(ctx.getValue()==1){
      this.setState(new ConcreteStateB());
   }else if(ctx.getValue()==2){
       this.setState(new ConcreteStateC());
   }
}

2.3、共享狀態(tài)

在有些情況下,多個(gè)環(huán)境對(duì)象可能需要共享同一個(gè)狀態(tài)。如果希望在系統(tǒng)中實(shí)現(xiàn)多個(gè)環(huán)境對(duì)象共享一個(gè)或多個(gè)狀態(tài)對(duì)象,那么需要將這些狀態(tài)對(duì)象定義為環(huán)境類(lèi)的靜態(tài)成員對(duì)象。

下面通過(guò)一個(gè)簡(jiǎn)單實(shí)例來(lái)說(shuō)明如何實(shí)現(xiàn)共享狀態(tài)。如果某系統(tǒng)要求兩個(gè)開(kāi)關(guān)對(duì)象要么都處于開(kāi)的狀態(tài),要么都處于關(guān)的狀態(tài),在使用時(shí)它們的狀態(tài)必須保持一致。開(kāi)關(guān)可以由開(kāi)轉(zhuǎn)換到關(guān),也可以由關(guān)轉(zhuǎn)換到開(kāi)。

可以使用狀態(tài)模式來(lái)實(shí)現(xiàn)開(kāi)關(guān)的設(shè)計(jì),其結(jié)構(gòu)如下圖所示:
狀態(tài)模式——對(duì)象狀態(tài)及其轉(zhuǎn)換,設(shè)計(jì)模式,狀態(tài)模式

3、狀態(tài)模式總結(jié)

狀態(tài)模式將一個(gè)對(duì)象在不同狀態(tài)下的不同行為封裝在一個(gè)個(gè)狀態(tài)類(lèi)中。通過(guò)設(shè)置不同的狀態(tài)對(duì)象可以讓環(huán)境對(duì)象擁有不同的行為,而狀態(tài)轉(zhuǎn)換的細(xì)節(jié)對(duì)于客戶(hù)端而言是透明的,方便了客戶(hù)端的使用。在實(shí)際開(kāi)發(fā)中,狀態(tài)模式具有較高的使用頻率,在工作流、游戲等軟件中狀態(tài)模式都得到了廣泛應(yīng)用,例如公文狀態(tài)的轉(zhuǎn)換、游戲中角色的升級(jí)等。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632128.html

3.1、主要優(yōu)點(diǎn)

  1. 封裝了狀態(tài)的轉(zhuǎn)換規(guī)則。在狀態(tài)模式中可以將狀態(tài)的轉(zhuǎn)換代碼封裝在環(huán)境類(lèi)或者具體狀態(tài)類(lèi)中,對(duì)狀態(tài)轉(zhuǎn)換代碼進(jìn)行集中管理,而不是分散在一個(gè)個(gè)業(yè)務(wù)方法中。
  2. 將所有與某個(gè)狀態(tài)有關(guān)的行為放到一個(gè)類(lèi)中,只需要注入一個(gè)不同的狀態(tài)對(duì)象即可使環(huán)境對(duì)象擁有不同的行為。
  3. 允許狀態(tài)轉(zhuǎn)換邏輯與狀態(tài)對(duì)象合成一體,而不是提供一個(gè)巨大的條件語(yǔ)句塊。狀態(tài)模式可以避免使用龐大的條件語(yǔ)句來(lái)將業(yè)務(wù)方法和狀態(tài)轉(zhuǎn)換代碼交織在一起。
  4. 可以讓多個(gè)環(huán)境對(duì)象共享一個(gè)狀態(tài)對(duì)象,從而減少系統(tǒng)中對(duì)象的個(gè)數(shù)。

3.2、主要缺點(diǎn)

  1. 狀態(tài)模式的使用必然會(huì)增加系統(tǒng)中類(lèi)和對(duì)象的個(gè)數(shù),導(dǎo)致系統(tǒng)運(yùn)行開(kāi)銷(xiāo)增大。
  2. 狀態(tài)模式的程序結(jié)構(gòu)與實(shí)現(xiàn)都較為復(fù)雜,如果使用不當(dāng)將導(dǎo)致程序結(jié)構(gòu)和代碼的混亂,增加系統(tǒng)設(shè)計(jì)的難度。
  3. 狀態(tài)模式對(duì)開(kāi)閉原則的支持并不太好。增加新的狀態(tài)類(lèi)需要修改那些負(fù)責(zé)狀態(tài)轉(zhuǎn)換的源代碼,否則無(wú)法轉(zhuǎn)換到新增狀態(tài);而且修改某個(gè)狀態(tài)類(lèi)的行為也需修改對(duì)應(yīng)類(lèi)的源代碼。

3.3、使用場(chǎng)景

  1. 對(duì)象的行為依賴(lài)于它的狀態(tài)(例如某些屬性值),狀態(tài)的改變將導(dǎo)致行為的變化。
  2. 在代碼中包含大量與對(duì)象狀態(tài)有關(guān)的條件語(yǔ)句。這些條件語(yǔ)句的出現(xiàn),會(huì)導(dǎo)致代碼的可維護(hù)性和靈活性變差,不能方便地增加和刪除狀態(tài),并且導(dǎo)致客戶(hù)類(lèi)與類(lèi)庫(kù)之間的耦合增強(qiáng)。

到了這里,關(guān)于狀態(tài)模式——對(duì)象狀態(tài)及其轉(zhuǎn)換的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 設(shè)計(jì)模式:狀態(tài)模式示例

    狀態(tài)模式可以應(yīng)用于多種場(chǎng)景,下面是一些示例及其代碼實(shí)現(xiàn): 1. 交通信號(hào)燈 交通信號(hào)燈(紅燈、綠燈、黃燈)根據(jù)當(dāng)前狀態(tài)切換到下一個(gè)狀態(tài)。 2. 游戲角色等級(jí)系統(tǒng) 游戲中的角色根據(jù)經(jīng)驗(yàn)值提升等級(jí),不同等級(jí)有不同的行為。 這兩個(gè)示例展示了狀態(tài)模式在不同場(chǎng)景下的

    2024年04月23日
    瀏覽(23)
  • 設(shè)計(jì)模式_狀態(tài)模式

    設(shè)計(jì)模式_狀態(tài)模式

    介紹 設(shè)計(jì)模式 定義 案例 問(wèn)題堆積在哪里 解決辦法 狀態(tài)模式 一個(gè)對(duì)象 狀態(tài)可以發(fā)生改變 不同的狀態(tài)又有不同的行為邏輯 游戲角色 加載不同的技能 每個(gè)技能有不同的:攻擊邏輯 攻擊范圍 動(dòng)作等等 1 狀態(tài)很多 2 每個(gè)狀態(tài)有自己的屬性和邏輯 每種狀態(tài)單獨(dú)寫(xiě)一個(gè)類(lèi) 角色需要

    2024年02月06日
    瀏覽(20)
  • 設(shè)計(jì)模式-狀態(tài)模式

    設(shè)計(jì)模式-狀態(tài)模式

    一個(gè)對(duì)象有狀態(tài)變化 每次狀態(tài)變化都會(huì)觸發(fā)一個(gè)邏輯 不能總是用 if else 來(lái)控制 交通信號(hào)燈不同顏色的變化 傳統(tǒng)UML類(lèi)圖 簡(jiǎn)化后的UML類(lèi)圖 有限個(gè)狀態(tài)、以及在這些狀態(tài)之間的變化 如交通信號(hào)燈 使用開(kāi)源lib:javascript-state-machine github.com/jakesgordon/javascript-state-machine 有限狀態(tài)機(jī)

    2024年02月07日
    瀏覽(15)
  • 【設(shè)計(jì)模式】訂單狀態(tài)流傳中的狀態(tài)機(jī)與狀態(tài)模式

    【設(shè)計(jì)模式】訂單狀態(tài)流傳中的狀態(tài)機(jī)與狀態(tài)模式

    狀態(tài)模式一般是用在對(duì)象內(nèi)部的 狀態(tài)流轉(zhuǎn) 場(chǎng)景中,用來(lái)實(shí)現(xiàn) 狀態(tài)機(jī) 。 什么是狀態(tài)機(jī)呢? 狀態(tài)機(jī)是對(duì)狀態(tài)轉(zhuǎn)移的抽象,由 事件 、 狀態(tài) 、 動(dòng)作 組成,事件有時(shí)候也被稱(chēng)為 轉(zhuǎn)移事件 或者 轉(zhuǎn)移 ,當(dāng)事件觸發(fā)時(shí),可以將狀態(tài)由一個(gè)狀態(tài)變更為另一個(gè)狀態(tài),并執(zhí)行動(dòng)作。其中,

    2024年02月12日
    瀏覽(25)
  • 設(shè)計(jì)模式之狀態(tài)模式筆記

    設(shè)計(jì)模式之狀態(tài)模式筆記

    記錄下學(xué)習(xí)設(shè)計(jì)模式-狀態(tài)模式的寫(xiě)法。JDK使用版本為1.8版本。 意圖 :允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。 結(jié)構(gòu) : 其中: Context(上下文)定義客戶(hù)感興趣的接口;維護(hù)一個(gè)ConcreteState子類(lèi)的實(shí)例,這個(gè)實(shí)例定義當(dāng)前狀態(tài)。 State(狀態(tài))定義一個(gè)接口以封裝與Context的一個(gè)

    2024年02月10日
    瀏覽(26)
  • 【前端設(shè)計(jì)模式】之狀態(tài)模式

    在前端開(kāi)發(fā)中,我們經(jīng)常需要處理復(fù)雜的應(yīng)用狀態(tài)。這時(shí)候,狀態(tài)模式就能派上用場(chǎng)了。狀態(tài)模式允許我們根據(jù)不同的狀態(tài)來(lái)改變對(duì)象的行為,從而實(shí)現(xiàn)優(yōu)雅地管理應(yīng)用狀態(tài)。 狀態(tài)模式具有以下特性: 狀態(tài)(State):定義了對(duì)象在特定條件下所處的行為和屬性。 上下文(C

    2024年01月20日
    瀏覽(22)
  • 行為型設(shè)計(jì)模式——狀態(tài)模式

    行為型設(shè)計(jì)模式——狀態(tài)模式

    狀態(tài)模式是比較簡(jiǎn)單的設(shè)計(jì)模式,它的主要作用是減少代碼中大量的 if-else 或者 switch-case 等邏輯判斷(俗稱(chēng)屎山)。它將每個(gè)狀態(tài)定義為一個(gè)類(lèi),而每個(gè)狀態(tài)類(lèi)有自己對(duì)應(yīng)的方法,因此當(dāng)需要根據(jù)狀態(tài)執(zhí)行邏輯代碼時(shí)不需要寫(xiě)大量的if-else判斷是哪個(gè)狀態(tài)然后執(zhí)行對(duì)應(yīng)的邏輯

    2024年02月02日
    瀏覽(30)
  • 設(shè)計(jì)模式行為型-狀態(tài)模式

    設(shè)計(jì)模式行為型-狀態(tài)模式

    狀態(tài)模式是一種行為型設(shè)計(jì)模式,用于處理對(duì)象在不同狀態(tài)下的行為變化。它將對(duì)象的行為封裝在不同狀態(tài)類(lèi)中,通過(guò)狀態(tài)的切換實(shí)現(xiàn)不同行為的觸發(fā)。 本文將介紹狀態(tài)模式的基本概念、應(yīng)用場(chǎng)景以及優(yōu)勢(shì)與適用性。 實(shí)現(xiàn)具體狀態(tài)類(lèi) 具體工作類(lèi): 上下文類(lèi)包含狀態(tài)對(duì)象的引

    2024年02月10日
    瀏覽(25)
  • Java設(shè)計(jì)模式-狀態(tài)模式

    在軟件開(kāi)發(fā)領(lǐng)域,設(shè)計(jì)模式是一組經(jīng)過(guò)驗(yàn)證的、被廣泛接受的解決問(wèn)題的方案。其中之一是狀態(tài)模式,它提供了一種優(yōu)雅的方式來(lái)管理對(duì)象的不同狀態(tài)。 狀態(tài)模式是一種行為型設(shè)計(jì)模式,它允許對(duì)象在內(nèi)部狀態(tài)發(fā)生改變時(shí)改變其行為。狀態(tài)模式將對(duì)象的行為封裝在不同的狀態(tài)

    2024年02月06日
    瀏覽(25)
  • 設(shè)計(jì)模式之狀態(tài)模式(下)

    設(shè)計(jì)模式之狀態(tài)模式(下)

    3)共享狀態(tài) 1.概述 在某些情況下,多個(gè)環(huán)境對(duì)象可能需要共享同一個(gè)狀態(tài),如果希望在系統(tǒng)中實(shí)現(xiàn)多個(gè)環(huán)境對(duì)象共享一個(gè)或多個(gè)狀態(tài)對(duì)象,那么需要將這些狀態(tài)對(duì)象定義為環(huán)境類(lèi)的靜態(tài)成員對(duì)象。 2.案例 背景 :要求兩個(gè)開(kāi)關(guān)對(duì)象要么都處于開(kāi)的狀態(tài),要么都處于關(guān)的狀態(tài),

    2024年04月25日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包