内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

設(shè)計模式之命令模式-引導(dǎo)篇及原理

設(shè)計模式之命令模式-引導(dǎo)篇及原理

為臨猗等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及臨猗網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站設(shè)計、臨猗網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

設(shè)計模式之命令模式-引導(dǎo)篇及原理

引導(dǎo)

司小司又接到了新項目:家電自動化遙控器API項目。

項目背景:隨著物聯(lián)網(wǎng)的流行以及智能化家具普及。一個遙控器可以管控家里所有設(shè)備(家電等)也很正常了。

來源:凱哥Java(kaigejava)

設(shè)計模式之命令模式-引導(dǎo)篇及原理

設(shè)計模式之命令模式-引導(dǎo)篇及原理

如上圖:假設(shè)空心的是關(guān),實心的是開。

需求:

1:給出各個家電(電燈、電視、音響等)的API,需要在這個遙控器接口中,對接這些API來實現(xiàn)對不同家電的控制。

2:要求自動化遙控器要擴(kuò)展性好、維護(hù)性好。

第一版設(shè)計:面向?qū)ο蟮膫鹘y(tǒng)思維

說明:0代表電燈對象,1打開音響的音量命令 2:音響音量命令

我們來看看傳統(tǒng)OO思維下項目結(jié)構(gòu):

設(shè)計模式之命令模式-引導(dǎo)篇及原理

說明:

1:電燈和音響SDK相關(guān)的API

2:傳統(tǒng)OO思維下的遙控器

3:遙控器接口

4:測試類

電燈SDKAPI

public class?LightAPI {

? ?/**

? ? * 電燈所在位置

? ? */

? ?private?String?location?=?"";

? ?public?LightAPI (String location){

? ? ? ?this.location?= location;

? ?}

? ?/**

? ? * 開燈效果

? ? */

? ?public void?On(){

? ? ? ?System.out.println(location?+"的燈打開");

? ?}

? ?/**

? ? * 關(guān)燈

? ? */

? ?public void?Off(){

? ? ? ?System.out.println(location+"的燈關(guān)了");

? ?}

}

遙控器接口:

public interface?Control {

? ?public void?onButton(int?slot);

? ?public void?offButton(int?slot);

? ?public void?undoButton();

}

傳統(tǒng)oo對象實現(xiàn)了遙控器接口:

/**

* Created by kaigejava on 2019/8/28.

* 傳統(tǒng)面向?qū)ο蟮倪b控器對象

*

*/

public class?TraditionOOControl?implements?Control {

? ?private?LightAPI?light;

? ?private?StereoAPI?stereo;

? ?public?TraditionOOControl(LightAPI light,StereoAPI stereo){

? ? ? ?this.light?= light;

? ? ? ?this.stereo?= stereo;

? ?}

? ?@Override

? ?public void?onButton(int?slot) {

? ? ? ?switch?(slot) {

? ? ? ? ? ?case?0:

? ? ? ? ? ? ? ?light.On();

? ? ? ? ? ? ? ?break;

? ? ? ? ? ?case?1:

? ? ? ? ? ? ? ?stereo.On();

? ? ? ? ? ? ? ?break;

? ? ? ? ? ?case?2:

? ? ? ? ? ? ? ?int?vol =?stereo.GetVol();

? ? ? ? ? ? ? ?if?(vol <?11) {

? ? ? ? ? ? ? ? ? ?stereo.AddVolume(++vol);

? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ?break;

? ? ? ?}

? ?}

? ?@Override

? ?public void?offButton(int?slot) {

? ? ? ?switch?(slot) {

? ? ? ? ? ?case?0:

? ? ? ? ? ? ? ?light.Off();

? ? ? ? ? ? ? ?break;

? ? ? ? ? ?case?1:

? ? ? ? ? ? ? ?stereo.Off();

? ? ? ? ? ? ? ?break;

? ? ? ? ? ?case?2:

? ? ? ? ? ? ? ?int?vol =?stereo.GetVol();

? ? ? ? ? ? ? ?if?(vol >?0) {

? ? ? ? ? ? ? ? ? ?stereo.downVolume(--vol);

? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ?break;

? ? ? ?}

? ?}

? ?@Override

? ?public void?undoButton() {

? ?}

}

測試類:

public class?OOTest {

? ?public static void?main(String[] args) {

? ? ? ?Control ctl;

? ? ? ?LightAPI light =?new?LightAPI("臥室");

? ? ? ?StereoAPI stereo =?new?StereoAPI();

? ? ? ?ctl =?new?TraditionOOControl(light, stereo);

? ? ? ?ctl.onButton(0);

? ? ? ?ctl.offButton(0);

? ? ? ?ctl.onButton(1);

? ? ? ?ctl.onButton(2);

? ? ? ?ctl.offButton(2);

? ? ? ?ctl.offButton(1);

? ?}

}

運行結(jié)果:

設(shè)計模式之命令模式-引導(dǎo)篇及原理

這樣來看,貌似可以了。我們在來看看這樣做又什么不好。

假設(shè)現(xiàn)在又有了新需求,需要對接一個掃地機器人(相信大家知道,現(xiàn)在掃地機器人很多家庭都在用了吧)。這個需求來了,我們應(yīng)該怎么做呢 ?

需要修改的地方:

1:SDK肯定需要新增加機器人對于的類

2:我們在TraditionControl類中也需要添加機器人的屬性,并且在有參構(gòu)造函數(shù)、OnButton方法OffButton方法中都有做對應(yīng)的調(diào)整。

感覺真?zhèn)€TraditionControl對象都被修改了。這樣還只是添加了一個。如果再過兩天又需要添加一個智能音響或者其他的。同樣的修改還需要再來一遍。這樣雖然功能是能實現(xiàn),但是再擴(kuò)展性和維護(hù)性上就不好了。就不符合人家客戶的需求了。

綜上所述,司小司決定不使用傳統(tǒng)的OO思想來實現(xiàn)了。

我們來分析,SDK和遙控器之間,是通過一個一個按鈕(命令)進(jìn)行連接了。那么,有沒有一種更好的方案來實現(xiàn)呢?司小司經(jīng)過調(diào)研發(fā)現(xiàn),命令模式就很適合這種場景了。

我們來看看命令模式。

命令模式原理

我們先來看看命令模式原理類圖,如下圖:

設(shè)計模式之命令模式-引導(dǎo)篇及原理

原理類圖說明:

控制器(Invoker)里面有個命令接口(Command),通過控制器里面的命令接口調(diào)用實現(xiàn)該接口的類(ConcreteCommand),進(jìn)而來控制,具體對象(Receiver)執(zhí)行

命令模式:

簡單理解:就是將我們的命令抽取成一個對象,然后將這個對象放到我們控制器里面。通過控制器來調(diào)用命令對象的實際方法。

定義:

將請求、命令、動作等封裝成對象,這樣可以讓項目使用這些對象參數(shù)化其他對象。進(jìn)而達(dá)到命令的請求者和執(zhí)行者進(jìn)行解耦。

在知道命令模式原理之后,我們再來重新設(shè)計遙控器項目的類圖,就如下了:

設(shè)計模式之命令模式-引導(dǎo)篇及原理

類圖說明:

Control:遙控器對象

Command:命令接口

LigthXXX:電燈對象相關(guān)命令對象

StereoXXX:音響對象相關(guān)命令對象

Light:電燈對象

Stereo:音響對象

好了,我們經(jīng)過分析,使用命令模式對項目進(jìn)行了設(shè)計。那么接下來,我們就使用代碼來實現(xiàn)吧。歡迎接著學(xué)習(xí)下一篇。再下一篇中,我們將通過代碼來實現(xiàn)命令模式下的遙控器項目。

凱哥個人博客:www.kaigejava.com

本文標(biāo)題:設(shè)計模式之命令模式-引導(dǎo)篇及原理
本文路徑:http://m.rwnh.cn/article34/jejhse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、網(wǎng)頁設(shè)計公司、網(wǎng)站維護(hù)、云服務(wù)器、網(wǎng)站導(dǎo)航域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
武平县| 晴隆县| 贵港市| 隆子县| 固原市| 丰原市| 稷山县| 西乌珠穆沁旗| 徐闻县| 凌源市| 孝昌县| 萨嘎县| 新河县| 额尔古纳市| 渭南市| 旬阳县| 漯河市| 龙陵县| 平泉县| 台东市| 财经| 安龙县| 梨树县| 长治市| 达孜县| 巴里| 保靖县| 蒙阴县| 越西县| 响水县| 郁南县| 大洼县| 鱼台县| 鄢陵县| 文登市| 铜鼓县| 黑水县| 汽车| 始兴县| 扶绥县| 商河县|