日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 99riav国产| 亚洲最色网站 | 亚洲日日骚 | 日本久久网 | 免费一级片网站 | 亚洲欧美国产一区二区三区 | 中文字幕一区二区人妻痴汉电车 | 国产一区不卡在线 | 久久一区国产 | 中国女人毛茸茸 | 久久刺激 | 爱福利视频广场 | 69式视频 | 人妻体体内射精一区二区 | 久久久久香蕉视频 | 超碰在线c | 中文不卡视频 | 中文在线最新版天堂 | 日韩一级在线视频 | 久久久久国产精品一区二区 | 最好看的中文字幕国语电影mv | 一出一进一爽一粗一大视频 | 日韩影院一区二区 | 午夜日韩欧美 | 精产国品一区二区三区 | 精品亚洲天堂 | 狠狠操狠狠操狠狠操 | 精品+无码+在线观看 | 一区二区三区91 | 搞黄视频在线观看 | 欧美在线aa | 日韩欧美网 | 黄色网页入口 | 免费看日批 | 日韩一级av毛片 | 成人欧美一区二区三区黑人冫 | 禁久久精品乱码 | 国产又白又嫩又爽又黄 | 手机av在线播放 | 国产精品欧美综合 | 福利在线一区二区三区 | 伊人激情在线 | 久久sp | 波多野结衣中文字幕一区二区三区 | 国产九九九九九 | 中文字幕丰满乱子伦无码专区 | 秋霞网av| 日本少妇久久久 | 加勒比综合网 | 小嫩女直喷白浆 | 人妻与黑人一区二区三区 | 日本一区二区三区在线观看 | 国产精品ⅴa有声小说 | 青青操视频在线观看 | 欧美xxxx吸乳 | 99久久影院 | 亚洲激情黄色 | 中国字幕一色哟哟 | 天天操天天干天天摸 | 中文字幕人妻一区 | 亚州色图欧美色图| av色资源 | 911香蕉视频| 黄色a在线观看 | 中文字幕高清 | 大陆明星乱淫(高h)小说 | 欧美日p视频 | 亚洲天堂五月 | 国产一区二区在 | 亚洲一区毛片 | 久久久久久国产视频 | 久久久九九九热 | 亚洲免费三级 | 又黄又色又爽 | 成人黄色一区二区 | 四虎影视精品 | 成人三级电影网站 | 三级视频黄色 | 四虎在线观看 | 69精品久久久 | 影音先锋亚洲精品 | 色视频一区二区 | 国产精品午夜在线观看 | 中文字母av| 日本在线观看中文字幕 | 日韩aa视频 | 国产95在线 | 成人免费观看视频网站 | 女人叫床高潮娇喘声录音mp3 | 清冷学长被爆c躁到高潮失禁 | 在线播放第一页 | 日韩av网站在线观看 | 欧美精品999 | 欧美一区二区三区在线看 | 日本夫妻性生活视频 | 人人叉人人 | 男生和女生一起差差差视频 | 美女av在线免费观看 | 色乱码一区二区三区 |