日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

设计模式 命令模式 之 管理智能家电

發(fā)布時(shí)間:2025/7/14 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 命令模式 之 管理智能家电 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

繼續(xù)設(shè)計(jì)模式哈,今天帶來(lái)命令模式,二話不說(shuō),先看定義:

定義:將“請(qǐng)求”封裝成對(duì)象,以便使用不同的請(qǐng)求、隊(duì)列或者日志來(lái)參數(shù)化其他對(duì)象。命令模式也支持可撤銷的操作。

這尼瑪定義,看得人蛋疼,看不明白要淡定,我稍微簡(jiǎn)化一下:將請(qǐng)求封裝成對(duì)象,將動(dòng)作請(qǐng)求者和動(dòng)作執(zhí)行者解耦。好了,直接用例子來(lái)說(shuō)明。

需求:最近智能家電很火熱啊,未來(lái)尼瑪估計(jì)冰箱都會(huì)用支付寶自動(dòng)買東西了,,,,假設(shè)現(xiàn)在有電視、電腦、電燈等家電,現(xiàn)在需要你做個(gè)遙控器控制所有家電的開(kāi)關(guān),要求做到每個(gè)按鈕對(duì)應(yīng)的功能供用戶個(gè)性化,對(duì)于新買入家電要有非常強(qiáng)的擴(kuò)展性。

這個(gè)需求一看,尼瑪要是沒(méi)有什么個(gè)性化、擴(kuò)展性還好說(shuō)啊,直接針對(duì)每個(gè)遙控器的按鈕onClick,然后在里面把代碼寫死就搞定了,但是個(gè)性化怎么整,還要有擴(kuò)展性。。。

好了,下面命令模式出場(chǎng),命令模式的核心就是把命令封裝成類,對(duì)于命令執(zhí)行者不需要知道現(xiàn)在執(zhí)行的具體是什么命令。

1、首先看下我們擁有的家電的API:

package com.zhy.pattern.command; /*** 門* @author zhy**/ public class Door {public void open(){System.out.println("打開(kāi)門");}public void close(){System.out.println("關(guān)閉門");}}
package com.zhy.pattern.command;/*** 電燈* @author zhy**/ public class Light {public void on(){System.out.println("打開(kāi)電燈");}public void off(){System.out.println("關(guān)閉電燈");} }
package com.zhy.pattern.command; /*** 電腦* @author zhy**/ public class Computer {public void on(){System.out.println("打開(kāi)電腦");}public void off(){System.out.println("關(guān)閉電腦");} }
看來(lái)我們有電燈、電腦、和門,并且開(kāi)關(guān)的接口的設(shè)計(jì)好了。接下來(lái)看如何把命令封裝成類:

package com.zhy.pattern.command;public interface Command {public void execute(); }

package com.zhy.pattern.command;/*** 關(guān)閉電燈的命令* @author zhy**/ public class LightOffCommond implements Command {private Light light ; public LightOffCommond(Light light){this.light = light;}@Overridepublic void execute(){light.off();}}
package com.zhy.pattern.command;/*** 打開(kāi)電燈的命令* @author zhy**/ public class LightOnCommond implements Command {private Light light ; public LightOnCommond(Light light){this.light = light;}@Overridepublic void execute(){light.on();}}
package com.zhy.pattern.command;/*** 開(kāi)電腦的命令* @author zhy**/ public class ComputerOnCommond implements Command {private Computer computer ; public ComputerOnCommond( Computer computer){this.computer = computer;}@Overridepublic void execute(){computer.on();}}
package com.zhy.pattern.command;/*** 關(guān)電腦的命令* @author zhy**/ public class ComputerOffCommond implements Command {private Computer computer ; public ComputerOffCommond( Computer computer){this.computer = computer;}@Overridepublic void execute(){computer.off();}}
好了,不貼那么多了,既然有很多命令,按照設(shè)計(jì)原則,我們肯定有個(gè)超類型的Command,然后各個(gè)子類,看我們把每個(gè)命令(請(qǐng)求)都封裝成類了。接下來(lái)看我們的遙控器。

package com.zhy.pattern.command;/*** 控制器面板,一共有9個(gè)按鈕* * @author zhy* */ public class ControlPanel {private static final int CONTROL_SIZE = 9;private Command[] commands;public ControlPanel(){commands = new Command[CONTROL_SIZE];/*** 初始化所有按鈕指向空對(duì)象*/for (int i = 0; i < CONTROL_SIZE; i++){commands[i] = new NoCommand();}}/*** 設(shè)置每個(gè)按鈕對(duì)應(yīng)的命令* @param index* @param command*/public void setCommand(int index, Command command){commands[index] = command;}/*** 模擬點(diǎn)擊按鈕* @param index*/public void keyPressed(int index){commands[index].execute();}}
package com.zhy.pattern.command;/*** @author zhy**/ public class NoCommand implements Command {@Overridepublic void execute(){}}
注意看到我們的遙控器有9個(gè)按鈕,提供了設(shè)置每個(gè)按鈕的功能和點(diǎn)擊的方法,還有注意到我們使用了一個(gè)NoCommand對(duì)象,叫做空對(duì)象,這個(gè)對(duì)象的好處就是,我們不用執(zhí)行前都判斷個(gè)if(!=null),并且提供了一致的操作。

最后測(cè)試一下代碼:

package com.zhy.pattern.command;public class Test {public static void main(String[] args){/*** 三個(gè)家電*/Light light = new Light();Door door = new Door();Computer computer = new Computer();/*** 一個(gè)控制器,假設(shè)是我們的app主界面*/ControlPanel controlPanel = new ControlPanel();// 為每個(gè)按鈕設(shè)置功能controlPanel.setCommand(0, new LightOnCommond(light));controlPanel.setCommand(1, new LightOffCommond(light));controlPanel.setCommand(2, new ComputerOnCommond(computer));controlPanel.setCommand(3, new ComputerOffCommond(computer));controlPanel.setCommand(4, new DoorOnCommond(door));controlPanel.setCommand(5, new DoorOffCommond(door));// 模擬點(diǎn)擊controlPanel.keyPressed(0);controlPanel.keyPressed(2);controlPanel.keyPressed(3);controlPanel.keyPressed(4);controlPanel.keyPressed(5);controlPanel.keyPressed(8);// 這個(gè)沒(méi)有指定,但是不會(huì)出任何問(wèn)題,我們的NoCommand的功勞} }

輸出結(jié)果:


可以看到任意按鈕可以隨意配置任何命令,再也不需要尼瑪?shù)淖円幌滦枨蟾拇a了,隨便用戶怎么個(gè)性化了。其實(shí)想白了,這里的設(shè)置我們還可以配置到一個(gè)配置文件中,完全的解耦有木有。


好了,用戶對(duì)于這個(gè)按鈕可能還不是太滿意,用戶希望夜深人靜的時(shí)候,能夠提供個(gè)按鈕直接關(guān)門、關(guān)燈、開(kāi)電腦,,,,大家懂的,,,我們稍微修改下代碼,滿足他

定義一個(gè)命令,用戶干一些列的事,可配置,且與原來(lái)的命令保持接口一致:

package com.zhy.pattern.command;/*** 定義一個(gè)命令,可以干一系列的事情* * @author zhy* */ public class QuickCommand implements Command {private Command[] commands;public QuickCommand(Command[] commands){this.commands = commands;}@Overridepublic void execute(){for (int i = 0; i < commands.length; i++){commands[i].execute();}}}
好了,已經(jīng)滿足屌絲的需求了。我們測(cè)試看看。

// 定義一鍵搞定模式QuickCommand quickCommand = new QuickCommand(new Command[] { new DoorOffCommond(door),new LightOffCommond(light), new ComputerOnCommond(computer) });System.out.println("****點(diǎn)擊一鍵搞定按鈕****");controlPanel.setCommand(8, quickCommand);controlPanel.keyPressed(8);

是不是很完美。


最后,繼續(xù)來(lái)談?wù)劽钅J?#xff0c;命令模式就是把命令封裝成對(duì)象,然后將動(dòng)作請(qǐng)求者與動(dòng)作執(zhí)行者完全解耦,上例中遙控器的按鈕和電器一毛錢關(guān)系都沒(méi)吧。

還記得定義中提到了隊(duì)列,命令模式如何用于隊(duì)列呢,比如飯店有很多個(gè)點(diǎn)菜的地方,有一個(gè)做菜的地方,把點(diǎn)菜看作命令,做菜看作命令執(zhí)行者,不斷有人點(diǎn)菜就相當(dāng)于把菜加入隊(duì)列,對(duì)于做菜的只管從隊(duì)列里面取,取一個(gè)做一個(gè)。

定義中還提到了日志,日志一般用于記錄用戶行為,或者在異常時(shí)恢復(fù)時(shí)用的,比如每個(gè)命令現(xiàn)在包含兩個(gè)方法,一個(gè)執(zhí)行execute,一個(gè)undo(上例中為了方便大家理解,沒(méi)有寫undo),我們可以把用戶所有命令調(diào)用保存到日志中,比如用戶操作不當(dāng)了,電器異常了,只需要把日志中所有的命令拿出來(lái)執(zhí)行一遍undo就完全恢復(fù)了,是吧,就是這么個(gè)意思。


好了,各位留個(gè)言、點(diǎn)個(gè)贊算是對(duì)我的支持,多謝大家~





版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。

轉(zhuǎn)載于:https://www.cnblogs.com/dingxiaoyue/p/4924964.html

總結(jié)

以上是生活随笔為你收集整理的设计模式 命令模式 之 管理智能家电的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。