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

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

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


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

1. 定義

狀態(tài)模式是一種行為型設(shè)計模式,用于通過將對象的行為封裝到不同的狀態(tài)類中,使得對象在不同的狀態(tài)下具有不同的行為。狀態(tài)模式允許對象在內(nèi)部狀態(tài)發(fā)生改變時改變其行為,而無需修改其代碼。狀態(tài)模式通常包含三個主要角色:上下文(Context)、抽象狀態(tài)(Abstract State)和具體狀態(tài)(Concrete State)。

  • 上下文(Context): 定義了一個接口,用于維護(hù)一個當(dāng)前狀態(tài)的引用,并提供一個用于切換狀態(tài)的方法
  • 抽象狀態(tài)(Abstract State): 定義了一個接口,用于封裝與上下文相關(guān)的一個或多個行為
  • 具體狀態(tài)(Concrete State): 實(shí)現(xiàn)了抽象狀態(tài)的接口,負(fù)責(zé)處理與狀態(tài)相關(guān)的行為

2. 應(yīng)用場景

狀態(tài)模式通常在以下場景中使用:

  • 一個對象的行為取決于其內(nèi)部狀態(tài),并且需要在運(yùn)行時根據(jù)內(nèi)部狀態(tài)改變其行為:

    當(dāng)一個對象的行為取決于其內(nèi)部狀態(tài),并且需要在運(yùn)行時根據(jù)內(nèi)部狀態(tài)改變其行為時,可以使用狀態(tài)模式

  • 一個對象具有多個狀態(tài),并且狀態(tài)之間存在轉(zhuǎn)換關(guān)系:

    當(dāng)一個對象具有多個狀態(tài),并且這些狀態(tài)之間存在轉(zhuǎn)換關(guān)系時,可以使用狀態(tài)模式

  • 避免使用過多的條件語句來控制對象的行為:

    當(dāng)需要避免使用過多的條件語句來控制對象的行為時,可以使用狀態(tài)模式,將每個狀態(tài)封裝到一個類中,使得代碼更加清晰和可維護(hù)

3. 代碼實(shí)現(xiàn)

下面通過一個簡單的例子來演示狀態(tài)模式的實(shí)現(xiàn)。假設(shè)有一個電梯系統(tǒng),電梯有開門、關(guān)門、上行、下行和停止等狀態(tài),我們可以使用狀態(tài)模式來管理電梯的不同狀態(tài)。

上下文 - 電梯 ElevatorContext

package com.cheney.demo;

class ElevatorContext {
    private ElevatorState currentState;

    public ElevatorContext() {
        this.currentState = new StoppedState();
    }

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

    public void openDoor() {
        currentState.openDoor(this);
    }

    public void closeDoor() {
        currentState.closeDoor(this);
    }

    public void moveUp() {
        currentState.moveUp(this);
    }

    public void moveDown() {
        currentState.moveDown(this);
    }
}

抽象狀態(tài) - 電梯狀態(tài) ElevatorState

package com.cheney.demo;

interface ElevatorState {
    void openDoor(ElevatorContext context);

    void closeDoor(ElevatorContext context);

    void moveUp(ElevatorContext context);

    void moveDown(ElevatorContext context);
}

具體狀態(tài) - 停止?fàn)顟B(tài) StoppedState

package com.cheney.demo;

class StoppedState implements ElevatorState {
    @Override
    public void openDoor(ElevatorContext context) {
        System.out.println("開門");
        context.setState(new OpenedState());
    }

    @Override
    public void closeDoor(ElevatorContext context) {
        System.out.println("門已經(jīng)關(guān)上了");
    }

    @Override
    public void moveUp(ElevatorContext context) {
        System.out.println("向上移動");
        context.setState(new MovingUpState());
    }

    @Override
    public void moveDown(ElevatorContext context) {
        System.out.println("向下移動");
        context.setState(new MovingDownState());
    }
}

具體狀態(tài) - 開門狀態(tài) OpenedState

package com.cheney.demo;

class OpenedState implements ElevatorState {
    @Override
    public void openDoor(ElevatorContext context) {
        System.out.println("門已經(jīng)打開了");
    }

    @Override
    public void closeDoor(ElevatorContext context) {
        System.out.println("關(guān)上門");
        context.setState(new StoppedState());
    }

    @Override
    public void moveUp(ElevatorContext context) {
        System.out.println("門打開時無法向上移動");
    }

    @Override
    public void moveDown(ElevatorContext context) {
        System.out.println("門打開時無法向下移動");
    }
}

具體狀態(tài) - 上行狀態(tài) MovingUpState

package com.cheney.demo;

class MovingUpState implements ElevatorState {
    @Override
    public void openDoor(ElevatorContext context) {
        System.out.println("向上移動時無法打開門");
    }

    @Override
    public void closeDoor(ElevatorContext context) {
        System.out.println("關(guān)上門");
        context.setState(new StoppedState());
    }

    @Override
    public void moveUp(ElevatorContext context) {
        System.out.println("繼續(xù)向上移動");
    }

    @Override
    public void moveDown(ElevatorContext context) {
        System.out.println("改變方向向下移動");
        context.setState(new MovingDownState());
    }
}

具體狀態(tài) - 下行狀態(tài) MovingDownState

package com.cheney.demo;

class MovingDownState implements ElevatorState {
    @Override
    public void openDoor(ElevatorContext context) {
        System.out.println("向下移動時無法打開門");
    }

    @Override
    public void closeDoor(ElevatorContext context) {
        System.out.println("關(guān)上門");
        context.setState(new StoppedState());
    }

    @Override
    public void moveUp(ElevatorContext context) {
        System.out.println("改變方向向上移動");
        context.setState(new MovingUpState());
    }

    @Override
    public void moveDown(ElevatorContext context) {
        System.out.println("繼續(xù)向下移動。");
    }
}

客戶端啟動類 Main

package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        // 使用狀態(tài)模式管理電梯狀態(tài)
        ElevatorContext elevator = new ElevatorContext();

        // 打開門
        elevator.openDoor();
        // 關(guān)上門
        elevator.closeDoor();
        // 向上移動
        elevator.moveUp();
        // 改變方向向下移動
        elevator.moveDown();
        // 向下移動時無法打開門
        elevator.openDoor();
    }
}

在上述例子中,ElevatorContext 是上下文類,維護(hù)了當(dāng)前狀態(tài)的引用,并提供了用于切換狀態(tài)的方法。ElevatorState 是抽象狀態(tài)接口,定義了與電梯狀態(tài)相關(guān)的行為。StoppedStateOpenedState、MovingUpStateMovingDownState 是具體狀態(tài)類,分別實(shí)現(xiàn)了抽象狀態(tài)接口,負(fù)責(zé)處理不同狀態(tài)下的行為。

在客戶端中,我們使用狀態(tài)模式管理電梯的狀態(tài)。通過將電梯的不同狀態(tài)封裝到不同的狀態(tài)類中,實(shí)現(xiàn)了電梯狀態(tài)的切換,而無需修改 ElevatorContext 的代碼。

結(jié)語

狀態(tài)模式是一種用于通過將對象的行為封裝到不同的狀態(tài)類中,使得對象在不同的狀態(tài)下具有不同的行為的設(shè)計模式。通過使用狀態(tài)模式,可以使代碼更加清晰、可維護(hù),并降低對象之間的耦合度。在實(shí)際開發(fā)中,狀態(tài)模式常被用于處理對象的狀態(tài)轉(zhuǎn)換、狀態(tài)機(jī)等場景。通過合理使用狀態(tài)模式,可以提高系統(tǒng)的可擴(kuò)展性和靈活性。


【Java 設(shè)計模式】系列 《23 種設(shè)計模式》 與 《7 大設(shè)計原則》 總綱
??設(shè)計原則
?單一職責(zé)原則(SRP) 規(guī)定一個類應(yīng)該只有一個引起變化的原因
?開放/封閉原則(OCP) 表明軟件實(shí)體應(yīng)該是可以擴(kuò)展的,但是不可修改的
?里氏替換原則(LSP) 強(qiáng)調(diào)派生類必須能夠替代其基類而不引起程序錯誤
?依賴倒置原則(DIP) 倡導(dǎo)高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴于抽象
?接口隔離原則(ISP) 提倡一個類不應(yīng)該被強(qiáng)迫依賴它不使用的接口
?合成/聚合復(fù)用原則(CARP) 建議盡量使用合成/聚合,盡量不要使用繼承
?迪米特法則(LoD) 規(guī)定一個對象應(yīng)該對其他對象有最少的了解

??創(chuàng)建型設(shè)計模式
?單例模式 保證一個類僅有一個實(shí)例,并提供一個訪問它的全局點(diǎn)
?工廠方法模式 定義一個用于創(chuàng)建對象的接口,但是由子類決定實(shí)例化哪一個類
?抽象工廠模式 提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類
?建造者模式 將一個復(fù)雜對象的構(gòu)建與其表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示
?原型模式 通過復(fù)制現(xiàn)有的對象來創(chuàng)建新對象,而不是從頭開始創(chuàng)建

??結(jié)構(gòu)型設(shè)計模式
?適配器模式 將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口
?橋接模式 將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化
?組合模式 將對象以樹形結(jié)構(gòu)組合以表示“部分-整體”的層次結(jié)構(gòu)
?裝飾器模式 動態(tài)地給一個對象添加一些額外的職責(zé)
?外觀模式 為子系統(tǒng)中的一組接口提供一個一致的界面
?代理模式 為其他對象提供一種代理以控制對這個對象的訪問
?享元模式 用共享的方式高效地支持大量小粒度對象

??行為型設(shè)計模式
?觀察者模式 定義對象間的一對多依賴,當(dāng)一個對象改變狀態(tài),所有依賴者都會受到通知并自動更新
?策略模式 定義一系列算法,將它們封裝起來,并且使它們可以相互替換
?命令模式 將請求封裝成對象,使得可以用不同的請求對客戶進(jìn)行參數(shù)化
?狀態(tài)模式 允許對象在其內(nèi)部狀態(tài)改變時改變它的行為
?責(zé)任鏈模式 為解除請求的發(fā)送者和接收者之間的耦合,而使多個對象都有機(jī)會處理這個請求
?訪問者模式 將算法與對象結(jié)構(gòu)分離,并且可以在不改變對象結(jié)構(gòu)的前提下定義新的操作
?中介者模式 用一個中介對象來封裝一系列的對象交互
?備忘錄模式 在不破壞封裝的情況下,捕獲對象的內(nèi)部狀態(tài),并在對象之外保存這個狀態(tài)
?迭代器模式 提供一種方法順序訪問一個聚合對象中的各個元素,而不暴露其內(nèi)部表示
?模版方法模式 定義一個操作中的算法的骨架,將一些步驟延遲到子類中
?解釋器模式 定義一個語言的文法,并且建立一個解釋器來解釋該語言中的句子

文章來源地址http://www.zghlxwxcb.cn/news/detail-820847.html

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

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

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

相關(guān)文章

  • 設(shè)計模式(十四):行為型之策略模式

    設(shè)計模式(十四):行為型之策略模式

    設(shè)計模式系列文章 設(shè)計模式(一):創(chuàng)建型之單例模式 設(shè)計模式(二、三):創(chuàng)建型之工廠方法和抽象工廠模式 設(shè)計模式(四):創(chuàng)建型之原型模式 設(shè)計模式(五):創(chuàng)建型之建造者模式 設(shè)計模式(六):結(jié)構(gòu)型之代理模式 設(shè)計模式(七):結(jié)構(gòu)型之適配器模式 設(shè)計模式(八):結(jié)構(gòu)型之裝

    2024年02月09日
    瀏覽(26)
  • 設(shè)計模式(016)行為型之命令模式

    ????????命令模式,它將請求封裝成一個對象,從而允許客戶端參數(shù)化操作隊列、記錄請求日志、支持撤銷操作等。在命令模式中,有四個核心角色:命令接口(Command)、具體命令(ConcreteCommand)、調(diào)用者(Invoker)、接收者(Receiver)。 ① 命令接口(Command) :聲明了執(zhí)

    2024年04月11日
    瀏覽(24)
  • 設(shè)計模式(十三):行為型之模板方法模式

    設(shè)計模式(十三):行為型之模板方法模式

    設(shè)計模式系列文章 設(shè)計模式(一):創(chuàng)建型之單例模式 設(shè)計模式(二、三):創(chuàng)建型之工廠方法和抽象工廠模式 設(shè)計模式(四):創(chuàng)建型之原型模式 設(shè)計模式(五):創(chuàng)建型之建造者模式 設(shè)計模式(六):結(jié)構(gòu)型之代理模式 設(shè)計模式(七):結(jié)構(gòu)型之適配器模式 設(shè)計模式(八):結(jié)構(gòu)型之裝

    2024年02月08日
    瀏覽(24)
  • 設(shè)計模式(二十):行為型之迭代器模式

    設(shè)計模式(二十):行為型之迭代器模式

    設(shè)計模式系列文章 設(shè)計模式(一):創(chuàng)建型之單例模式 設(shè)計模式(二、三):創(chuàng)建型之工廠方法和抽象工廠模式 設(shè)計模式(四):創(chuàng)建型之原型模式 設(shè)計模式(五):創(chuàng)建型之建造者模式 設(shè)計模式(六):結(jié)構(gòu)型之代理模式 設(shè)計模式(七):結(jié)構(gòu)型之適配器模式 設(shè)計模式(八):結(jié)構(gòu)型之裝

    2024年02月09日
    瀏覽(20)
  • C++設(shè)計模式行為型之觀察者模式

    一、 概述 ????????觀察者模式定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。 二、 示例代碼 #include list class Subject; class Observer { public: ?? ?virtual ~Observer(); ?? ?virtual void Update(Subject* theChangedSubject) =

    2024年02月14日
    瀏覽(28)
  • 深入理解設(shè)計模式-行為型之觀察者

    觀察者模式(Observer Pattern)是一種行為型設(shè)計模式,它定義了一種 一對多的依賴關(guān)系 ,讓 多個觀察者對象 同時監(jiān)聽一個 主題對象 ,當(dāng) 主題對象 發(fā)生 變化 時,所有依賴于它的 觀察者 對象都會得到 通知并更新。 在觀察者模式中,有兩個主要角色: Subject(主題):維護(hù)

    2024年02月12日
    瀏覽(27)
  • 【Java 設(shè)計模式】創(chuàng)建型之抽象工廠模式

    【Java 設(shè)計模式】創(chuàng)建型之抽象工廠模式

    在軟件開發(fā)中,抽象工廠模式是一種常見的創(chuàng)建型設(shè)計模式, 它提供了一種創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定它們具體的類 。抽象工廠模式的核心思想是將一組相關(guān)的產(chǎn)品組合成一個工廠,客戶端通過工廠接口創(chuàng)建一系列產(chǎn)品。在本文中,我們將介紹 Jav

    2024年01月17日
    瀏覽(28)
  • 【Java 設(shè)計模式】創(chuàng)建型之建造者模式

    【Java 設(shè)計模式】創(chuàng)建型之建造者模式

    在軟件開發(fā)中,建造者模式是一種創(chuàng)建型設(shè)計模式, 它將一個復(fù)雜對象的構(gòu)建與其表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示 。建造者模式通常包括一個指導(dǎo)者(Director)類和多個建造者(Builder)類,指導(dǎo)者負(fù)責(zé)組織建造者的構(gòu)建過程,而建造者負(fù)責(zé)具體的構(gòu)建步

    2024年01月21日
    瀏覽(20)
  • 【Java 設(shè)計模式】創(chuàng)建型之單例模式

    【Java 設(shè)計模式】創(chuàng)建型之單例模式

    在軟件開發(fā)中,單例模式是一種常見的設(shè)計模式, 它確保一個類只有一個實(shí)例,并提供一個全局訪問點(diǎn) 。單例模式在需要控制某些資源,如數(shù)據(jù)庫連接池、線程池等共享資源的情況下非常有用。在本文中,我們將介紹 Java 設(shè)計模式中的單例模式,了解其實(shí)現(xiàn)方式、使用場景

    2024年01月18日
    瀏覽(26)
  • 【Java 設(shè)計模式】創(chuàng)建型之工廠方法模式

    【Java 設(shè)計模式】創(chuàng)建型之工廠方法模式

    在軟件開發(fā)中,工廠方法模式是一種常見的創(chuàng)建型設(shè)計模式, 它提供了一種將對象的實(shí)例化延遲到子類的方法 。工廠方法模式通過定義一個創(chuàng)建對象的接口,但是讓子類決定實(shí)例化哪個類。在本文中,我們將介紹 Java 設(shè)計模式中的工廠方法模式,了解其定義、使用場景以及

    2024年01月17日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包