為臨猗等地區(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è)空心的是關(guān),實心的是開。
需求:
1:給出各個家電(電燈、電視、音響等)的API,需要在這個遙控器接口中,對接這些API來實現(xiàn)對不同家電的控制。
2:要求自動化遙控器要擴(kuò)展性好、維護(hù)性好。
第一版設(shè)計:面向?qū)ο蟮膫鹘y(tǒng)思維
說明:0代表電燈對象,1打開音響的音量命令 2:音響音量命令
我們來看看傳統(tǒng)OO思維下項目結(jié)構(gòu):
說明:
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è)現(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),命令模式就很適合這種場景了。
我們來看看命令模式。
命令模式原理
我們先來看看命令模式原理類圖,如下圖:
原理類圖說明:
控制器(Invoker)里面有個命令接口(Command),通過控制器里面的命令接口調(diào)用實現(xiàn)該接口的類(ConcreteCommand),進(jìn)而來控制,具體對象(Receiver)執(zhí)行
命令模式:
簡單理解:就是將我們的命令抽取成一個對象,然后將這個對象放到我們控制器里面。通過控制器來調(diào)用命令對象的實際方法。
定義:
將請求、命令、動作等封裝成對象,這樣可以讓項目使用這些對象參數(shù)化其他對象。進(jìn)而達(dá)到命令的請求者和執(zhí)行者進(jìn)行解耦。
在知道命令模式原理之后,我們再來重新設(shè)計遙控器項目的類圖,就如下了:
類圖說明:
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)