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

第十五章行為性模式—命令模式

這篇具有很好參考價值的文章主要介紹了第十五章行為性模式—命令模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。


行為型模式用于描述程序在運(yùn)行時復(fù)雜的流程控制,即描述多個類或?qū)ο笾g怎樣相互協(xié)作共同完成單個對象無法單獨(dú)完成的任務(wù),它涉及算法與對象間職責(zé)的分配。行為型模式分為類行為模式和對象行為模式:
  • 類行為模式:采用繼承機(jī)制來在類間分派行為

  • 對象行為模式:采用組合或聚合在對象間分配行為

由于組合關(guān)系或聚合關(guān)系比繼承關(guān)系耦合度低,滿足“合成復(fù)用原則”,所以對象行為模式比類行為模式具有更大的靈活性。

行為型模式分為:

  • 模板方法模式
  • 策略模式
  • 命令模式
  • 職責(zé)鏈模式
  • 狀態(tài)模式
  • 觀察者模式
  • 中介者模式
  • 迭代器模式
  • 訪問者模式
  • 備忘錄模式
  • 解釋器模式

以上 11 種行為型模式,除了模板方法模式解釋器模式是類行為型模式,其他的全部屬于對象行為型模式。

命令模式

定義:將一個請求封裝為一個對象,使發(fā)出請求的責(zé)任執(zhí)行請求的責(zé)任分割開。這樣兩者之間通過命令對象進(jìn)行溝通,這樣方便將命令對象進(jìn)行存儲、傳遞、調(diào)用、增加與管理。

命令模式是一種行為設(shè)計(jì)模式**,它將請求轉(zhuǎn)換為一個包含與請求相關(guān)的所有信息的獨(dú)立對象**,該轉(zhuǎn)換讓你能夠根據(jù)不同的請求將方法參數(shù)化,延遲請求執(zhí)行或者將其放入隊(duì)列中,且能夠?qū)崿F(xiàn)可撤銷操作

解決的問題

第十五章行為性模式—命令模式

  • 客戶點(diǎn)菜是通過服務(wù)員,所以發(fā)送請求的責(zé)任屬于服務(wù)員
  • 具體的菜品是廚師進(jìn)行烹飪,所以執(zhí)行請求的測試的屬于廚師
  • 將發(fā)送請求的責(zé)任與執(zhí)行請求的責(zé)任分開

結(jié)構(gòu)

  • 抽象命令類(Command)角色: 定義命令的接口,聲明執(zhí)行的方法。
  • 具體命令(Concrete Command)角色:具體的命令,實(shí)現(xiàn)命令接口;通常會持有接收者,并調(diào)用接收者的功能來完成命令要執(zhí)行的操作。
  • 實(shí)現(xiàn)者/接收者(Receiver)角色: 接收者,真正執(zhí)行命令的對象。任何類都可能成為一個接收者,只要它能夠?qū)崿F(xiàn)命令要求實(shí)現(xiàn)的相應(yīng)功能。
  • 調(diào)用者/請求者(Invoker)角色: 要求命令對象執(zhí)行請求,通常會持有命令對象,可以持有很多的命令對象。這個是客戶端真正觸發(fā)命令并要求命令執(zhí)行相應(yīng)操作的地方,也就是說相當(dāng)于使用命令對象的入口。

實(shí)例

第十五章行為性模式—命令模式

分析命令模式的角色在該案例中由誰來充當(dāng):

  • 服務(wù)員: 就是調(diào)用者角色,由她來發(fā)起命令。
  • 資深大廚: 就是接收者角色,真正命令執(zhí)行的對象。
  • 訂單: 命令中包含訂單。

抽象命令類

public interface Command {
    void execute();
}

具體命令類

public class OrderCommand implements  Command{
    private SeniorChef receiver;
    private Order order;
    public OrderCommand(SeniorChef receiver, Order order) {
        this.receiver = receiver;
        this.order = order;
    }
    @Override
    public void execute() {
        System.out.println(order.getDiningTable() + "桌的訂單:");
        Map<String, Integer> foodDir = order.getFoodDir();
        Set<String> keys = foodDir.keySet();
        for (String foodName : keys) {
            receiver.makeFood(foodName, foodDir.get(foodName));
        }
        System.out.println(order.getDiningTable() + "桌的飯準(zhǔn)備完畢?。。?);

    }
}
/**
 * 訂單類
 */
@Data
public class Order {
    // 餐桌號碼
    private int diningTable;
    // 所下的餐品及份數(shù)
    private Map<String,Integer> foodDir = new HashMap<>();

    public void setFood(String name, int num) {
        foodDir.put(name,num);
    }
}

  • 聚合了接收者

接收者:資深大廚

public class SeniorChef {
    public void makeFood(String name,int num) {
        System.out.println(num + "份" + name);
    }
}

調(diào)用者:服務(wù)員

public class Waiter {
    //持有多個命令對象
    private List<Command> commands=new ArrayList<>();
    public void setCommand(Command cmd) {
        // 將命令類對象存儲到list集合中
        commands.add(cmd);
    }
    // 發(fā)起命令功能: 喊 訂單來了
    public void orderUp() {
        System.out.println("美女服務(wù)員:大廚,新訂單來了。。。。");
        for (Command command : commands) {
            if(command != null) {
                command.execute();
            }
        }
    }
}
  • 調(diào)用者中聚合了命令對象
  • 我們這里調(diào)用者就將我們的命令對象放入了隊(duì)列中,這種我們的可以命令對象進(jìn)行操作,比如延遲執(zhí)行,當(dāng)然也可以做到了我們的撤銷等操作

測試

public class Client {
    public static void main(String[] args) {
        // 創(chuàng)建第二個訂單對象
        Order order1 = new Order();
        order1.setDiningTable(1);
        order1.setFood("西紅柿雞蛋面",1);
        order1.setFood("小杯可樂",2);
        // 創(chuàng)建第二個訂單對象
        Order order2 = new Order();
        order2.setDiningTable(2);
        order2.setFood("尖椒肉絲蓋飯",1);
        order2.setFood("小杯雪碧",1);
        //創(chuàng)建接收者對象 廚師
        SeniorChef receiver = new SeniorChef();
        //創(chuàng)建命令對象
        OrderCommand orderCommand1 = new OrderCommand(receiver, order1);
        OrderCommand orderCommand2 = new OrderCommand(receiver, order2);
        // 創(chuàng)建調(diào)用者(服務(wù)員對象)
        Waiter invoke = new Waiter();
        invoke.setCommand(orderCommand1);
        invoke.setCommand(orderCommand2);
        //讓服務(wù)員發(fā)起命令
        invoke.orderUp();
    }
}
美女服務(wù)員:大廚,新訂單來了。。。。
1桌的訂單:
1份西紅柿雞蛋面
2份小杯可樂
1桌的飯準(zhǔn)備完畢?。?!
2桌的訂單:
1份尖椒肉絲蓋飯
1份小杯雪碧
2桌的飯準(zhǔn)備完畢?。?!

存在的問題

優(yōu)點(diǎn):

  • 降低系統(tǒng)的耦合度。命令模式能將調(diào)用操作的對象實(shí)現(xiàn)該操作的對象解耦。

  • 增加或刪除命令非常方便。采用命令模式增加與刪除命令不會影響其他類,它滿足 “開閉原則”,對擴(kuò)展比較靈活。

  • 可以實(shí)現(xiàn)宏命令。命令模式可以與組合模式結(jié)合,將多個命令裝配成一個組合命令,即宏命令。

  • 方便實(shí)現(xiàn) Undo 和 Redo 操作。命令模式可以與后面介紹的備忘錄模式結(jié)合,實(shí)現(xiàn)命令的撤銷與恢復(fù)。

缺點(diǎn):

  • 使用命令模式可能會導(dǎo)致某些系統(tǒng)有過多的具體命令類。
  • 系統(tǒng)結(jié)構(gòu)更加復(fù)雜。

適用場景

  • 系統(tǒng)需要將請求調(diào)用者和請求接收者解耦,使得調(diào)用者和接收者不直接交互。
  • 系統(tǒng)需要在不同的時間指定請求、將請求排隊(duì)和執(zhí)行請求。
  • 系統(tǒng)需要支持命令的撤銷 (Undo) 操作和恢復(fù) (Redo) 操作。

JDK 源碼 - Runnable

Runable 是一個典型命令模式,Runnable 擔(dān)當(dāng)命令的角色,Thread 充當(dāng)?shù)氖?strong>調(diào)用者,start 方法就是其執(zhí)行方法

  • 調(diào)用者和接收者分離了
// 命令接口(抽象命令角色)
public interface Runnable {
	public abstract void run();
}

// 調(diào)用者
public class Thread implements Runnable {
    private Runnable target;
    
    public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }
    
    private native void start0();
}

start 方法會調(diào)用一個 native 方法 start0(),調(diào)用系統(tǒng)方法,開啟一個線程。而接收者是對程序員開放的,可以自己定義接收者。文章來源地址http://www.zghlxwxcb.cn/news/detail-467283.html

/**
 * jdk Runnable 命令模式
 * TurnOffThread:屬于具體命令
 */
public class TurnOffThread implements Runnable{
     private Receiver receiver;
    
     public TurnOffThread(Receiver receiver) {
     	this.receiver = receiver;
     }
     public void run() {
     	receiver.turnOFF();
     }
}

到了這里,關(guān)于第十五章行為性模式—命令模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(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)文章

  • 第十五章 奇異值分解

    第十五章 奇異值分解

    奇異值分解(SVD)是一種矩陣因子分解方法。 任意一個 m × n mtimes n m × n 矩陣,都可以表示為三個矩陣的乘積(因子分解)形式,分別是 n n n 階正交矩陣、由降序排列的非負(fù)的對角線元素組成的 m × n mtimes n m × n 的矩形對角矩陣和 n n n 階正交矩陣。 矩陣的奇異值分解一定

    2024年02月07日
    瀏覽(24)
  • 第十五章——友元、異常

    第十五章——友元、異常

    友元 類并非只能擁有友元函數(shù),也可以將類作為友元。在這種情況下,友元類的所有方法都可以訪問原始類的私有成員和保護(hù)成員。因此盡管友元被授予從外部訪問類的私有部分的權(quán)限,但它們并不與面向?qū)ο蟮木幊趟枷胂嚆?,相反提高了共有接口的靈活性。 友元類? 假定

    2024年02月16日
    瀏覽(35)
  • [C國演義] 第十五章

    [C國演義] 第十五章

    力扣鏈接 子數(shù)組 ? dp[i]的含義: 以arr[i] 結(jié)尾的所有子數(shù)組中的最長湍流子數(shù)組的長度 子數(shù)組 ? 狀態(tài)轉(zhuǎn)移方程根據(jù) 最后一個位置來劃分 ?????? 初始化: 都初始化為1 ? 1. 一個數(shù)字也是一個湍流子數(shù)組. 2. 可以少考慮四種狀態(tài) 遍歷方向: 從前往后遍歷 返回結(jié)果: 返回g表 和

    2024年02月07日
    瀏覽(27)
  • 第十五章 RabbitMQ 延遲隊(duì)列

    第十五章 RabbitMQ 延遲隊(duì)列

    實(shí)際業(yè)務(wù)中,例如秒殺系統(tǒng),秒殺商品成功會有截止時間,這時需要用到RabbitMQ延遲服務(wù)。 TTL ,即 Time-To-Live,存活時間,消息和隊(duì)列都可以設(shè)置存活時間 Dead Letter,即死信,若給消息設(shè)置了存活時間,當(dāng)超過存活時間后消息還沒有被消費(fèi),則該消息變成了死信 Dead Letter Exc

    2024年01月25日
    瀏覽(34)
  • 【OpenCV】第十五章: 模板匹配

    【OpenCV】第十五章: 模板匹配

    第十五章: 模板匹配 模板匹配就是在給定的圖片中查找和模板最相似的區(qū)域。 實(shí)現(xiàn)的方法是:將模板在圖片上滑動(從左向右,從上向下),遍歷所有滑窗,計(jì)算匹配度,將所有計(jì)算結(jié)果保存在一個矩陣種,并將矩陣中匹配度最高的值作為匹配結(jié)果。 一、單模板匹配 1、匹配函

    2024年02月02日
    瀏覽(39)
  • WEB核心【會話技術(shù)】第十五章

    WEB核心【會話技術(shù)】第十五章

    目錄 ?? 個人主頁: ?愛吃豆的土豆 ?? 版權(quán): ?本文由【愛吃豆的土豆】原創(chuàng)、在CSDN首發(fā)、需要轉(zhuǎn)載請聯(lián)系博主 ?? 如果文章對你有幫助、 歡迎關(guān)注、點(diǎn)贊、收藏(一鍵三連)和訂閱專欄哦 ?? 人必有所執(zhí),方能有所成! ??希望大家多多支持??一起進(jìn)步呀! 1,會話技術(shù) ??

    2023年04月17日
    瀏覽(20)
  • 第十五章 Unity 角色移動旋轉(zhuǎn)實(shí)例

    第十五章 Unity 角色移動旋轉(zhuǎn)實(shí)例

    本章節(jié)我們創(chuàng)建一個“RoleDemoProject”工程,然后導(dǎo)入我們之前創(chuàng)建地形章節(jié)中的“TerrainDemo.unitypackage”資源包,這個場景很大,大家需要調(diào)整場景視角才能看清。 接下來,我們添加一個人物模型,操作方式就是將模型文件目錄復(fù)制到“Assets”下 然后Unity會自動同步該文件,我

    2024年02月06日
    瀏覽(22)
  • 《TCP IP 網(wǎng)絡(luò)編程》第十五章

    《TCP IP 網(wǎng)絡(luò)編程》第十五章

    ?標(biāo)準(zhǔn) I/O 函數(shù)的兩個優(yōu)點(diǎn): ????????除了使用 read 和 write 函數(shù)收發(fā)數(shù)據(jù)外,還能使用標(biāo)準(zhǔn) I/O 函數(shù)收發(fā)數(shù)據(jù)。下面是標(biāo)準(zhǔn) I/O 函數(shù)的兩個優(yōu)點(diǎn): 標(biāo)準(zhǔn) I/O 函數(shù)具有良好的移植性 標(biāo)準(zhǔn) I/O 函數(shù)可以利用緩沖提高性能 ????????創(chuàng)建套接字時,操作系統(tǒng)會準(zhǔn)備 I/O 緩沖。 此緩

    2024年02月14日
    瀏覽(25)
  • 北大青鳥第十五章蘑菇視頻案例

    實(shí)現(xiàn)了北大青鳥十五章蘑菇視頻所有功能,復(fù)制展示的代碼可以直接使用,最后底部的切換使用點(diǎn)擊事件自行更改即可

    2024年02月08日
    瀏覽(48)
  • 【Rust】Rust學(xué)習(xí) 第十五章智能指針

    【Rust】Rust學(xué)習(xí) 第十五章智能指針

    指針 ?( pointer )是一個包含內(nèi)存地址的變量的通用概念。這個地址引用,或 “指向”(points at)一些其他數(shù)據(jù)。Rust 中最常見的指針是第四章介紹的? 引用 ( reference )。引用以? ?符號為標(biāo)志并借用了他們所指向的值。除了引用數(shù)據(jù)沒有任何其他特殊功能。它們也沒有任

    2024年02月12日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包