成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解command設(shè)計(jì)模式,解耦操作和回滾

開發(fā) 前端
今天我們介紹的設(shè)計(jì)模式叫做命令模式(command),在這個(gè)模式下,我們可以實(shí)現(xiàn)do和undo的解耦,讓使用方不用關(guān)心內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。

今天我們介紹的設(shè)計(jì)模式叫做命令模式(command),在這個(gè)模式下,我們可以實(shí)現(xiàn)do和undo的解耦,讓使用方不用關(guān)心內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)。

command模式

這個(gè)模式我們?cè)谌粘.?dāng)中經(jīng)常使用,舉一個(gè)很簡(jiǎn)單的例子,比如說我們發(fā)布代碼。發(fā)布了之后發(fā)現(xiàn)不小心發(fā)布上去了一個(gè)bug,這個(gè)時(shí)候我們應(yīng)該做什么?很簡(jiǎn)單,就是回滾,把線上的代碼回滾到這一次發(fā)布之前的代碼。這樣我們這次發(fā)布帶來的改動(dòng)就會(huì)被消除,那么就避免了bug的產(chǎn)生。

那么,對(duì)于一個(gè)發(fā)布系統(tǒng)來說,它需要做什么?其實(shí)也就是兩個(gè)功能,一個(gè)是發(fā)布另外一個(gè)是回滾。這兩個(gè)操作是互相可逆的,對(duì)于它的使用者來說,是不會(huì)關(guān)心它的內(nèi)部是如何實(shí)現(xiàn)的,我們只需要在頁(yè)面上按按鈕就好了。

我們來回顧一下這個(gè)過程,我們點(diǎn)擊發(fā)布,可以把最新的代碼發(fā)布上線。發(fā)布之后發(fā)現(xiàn)問題,再點(diǎn)擊回滾,系統(tǒng)再自動(dòng)恢復(fù)到發(fā)布之前的狀態(tài)。發(fā)布和回滾彼此是可逆的,當(dāng)我們消除掉bug之后,再次點(diǎn)擊發(fā)布,又可以再次發(fā)布最新的代碼了。

command模式就是做的這個(gè)事情,也就是對(duì)do和undo的封裝。我們來看一個(gè)很簡(jiǎn)單的例子,對(duì)文件改名。比如說我們要把系統(tǒng)當(dāng)中的文件改名,從A.txt改成B.txt。這個(gè)功能很簡(jiǎn)單,系統(tǒng)為我們提供了現(xiàn)成的函數(shù),叫做os.rename(),我們只需要把A和B兩個(gè)文件的地址傳入其中即可。

假如我們發(fā)現(xiàn)改名字改錯(cuò)了,想回滾怎么辦呢?會(huì)發(fā)現(xiàn)我們改動(dòng)之前的名字已經(jīng)忘了,不知道怎么回滾了。這個(gè)時(shí)候就可以使用command模式,我們來看代碼:

 

  1. import os 
  2.  
  3. class MoveFileCommand: 
  4.  
  5.     def __init__(self, src, dest): 
  6.         self.src = src 
  7.         self.dest = dest 
  8.  
  9.     def execute(self): 
  10.         self.rename(self.src, self.dest) 
  11.  
  12.     def undo(self): 
  13.         self.rename(self.dest, self.src) 
  14.  
  15.     def rename(self, src, dest): 
  16.         print('renaming from {} to {}'.format(src, dest)) 
  17.         os.rename(src, dest) 

在execute方法當(dāng)中,我們把文件從src變成了dest,如果想要回滾,它又會(huì)再次調(diào)用rename。將文件名從dest回滾到src。這樣的話,作為使用方就可以完全不用理解api內(nèi)部的實(shí)現(xiàn)邏輯了,不然的話為了防止改錯(cuò)了的情況,還需要做很多適配。

menu item

有了command模式之后我們可以在外面在封裝一層用來ui交互上,我們很常見的一種UI交互方式就是按鈕。某一個(gè)按鈕點(diǎn)一下之后會(huì)出現(xiàn)一個(gè)按過的標(biāo)記,并且實(shí)現(xiàn)一個(gè)什么功能。再按一次標(biāo)記消失,功能也隨之關(guān)閉。

我隨便找了一個(gè)例子,比如下圖菜單當(dāng)中的show minimap,show breadcrumbs這些都是這樣的功能。點(diǎn)一下出現(xiàn)縮略圖,再點(diǎn)一下縮略圖消失。

 

詳解command設(shè)計(jì)模式,解耦操作和回滾

如果你寫過UI頁(yè)面的話,一般來說我們會(huì)先定義一個(gè)Menu Item的類,表示菜單當(dāng)中的所有的item的基類。不同的選項(xiàng)表示不同的item,我們進(jìn)一步分析會(huì)發(fā)現(xiàn)有些item我們需要這樣雙擊關(guān)閉的機(jī)制,而有些item是沒有的。比如上面的Run、Output這些item都是點(diǎn)一次執(zhí)行一次的。

我們當(dāng)然可以把上面介紹的Command對(duì)象直接當(dāng)做item,但是這樣不利于整個(gè)菜單的統(tǒng)一,所以我們還會(huì)在外面包一層。比如所有MenuItem的父類應(yīng)該是這樣的:

 

  1. class MenuItemBaseClass: 
  2.     def __init__(self): 
  3.         pass 
  4.      
  5.     def pressed(self): 
  6.         pass 
  7.      
  8.     def unpress(self): 
  9.         pass 

有了這個(gè)基類之后,我們就可以實(shí)現(xiàn)一個(gè)可回滾的類,將command的對(duì)象作為類成員變量,再在其中實(shí)現(xiàn)unpress方法:

 

  1. class RedoableMenu(MenuItemBaseClass): 
  2.     def __init__(self, command): 
  3.         self_command = command 
  4.          
  5.     def pressed(self): 
  6.         self._command.execute() 
  7.          
  8.     def unpress(self): 
  9.         self._command.undo() 

這樣我們的UI就和command解耦了,如果我們想要實(shí)現(xiàn)不同的可以回滾的功能, 只需要實(shí)現(xiàn)不同的command創(chuàng)建實(shí)例就可以了。對(duì)于整個(gè)UI的使用沒有任何影響,UI組件當(dāng)中用到的所有類都是統(tǒng)一的??赡茉赑ython這種弱類型語言當(dāng)中看不太出來,因?yàn)槲覀円粋€(gè)list說是menu基類的list,但是其實(shí)裝什么都行。但如果是強(qiáng)類型語言,那么這種抽象和封裝就是非常有必要的了。

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2023-02-28 09:10:28

設(shè)計(jì)模式解耦數(shù)據(jù)

2023-03-03 08:12:07

設(shè)計(jì)模式語言

2021-03-10 05:50:06

IOCReact解耦組件

2017-05-18 16:07:23

回滾數(shù)據(jù)庫(kù)代碼

2022-04-15 11:46:09

輕量系統(tǒng)解耦鴻蒙操作系統(tǒng)

2021-01-07 10:30:23

設(shè)計(jì)模式

2022-09-02 08:23:12

軟件開發(fā)解耦架構(gòu)

2012-12-26 09:36:45

MySQLDelete

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

架構(gòu)工具和方案

2025-02-11 07:55:45

2025-05-07 03:22:00

2022-07-13 08:36:57

MQ架構(gòu)設(shè)計(jì)模式

2025-03-13 09:22:39

2025-05-20 07:13:22

Spring異步解耦Event

2024-03-08 16:27:22

領(lǐng)域事件DDD項(xiàng)目跨層解耦

2020-11-20 15:22:32

架構(gòu)運(yùn)維技術(shù)

2009-07-28 10:21:05

自定義Command

2021-06-29 08:54:23

設(shè)計(jì)模式代理模式遠(yuǎn)程代理

2018-04-18 08:47:17

Alluxio構(gòu)建存儲(chǔ)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲在线中文字幕 | 亚洲视频欧美视频 | 男人视频网站 | 亚洲人成网站777色婷婷 | 特黄色一级毛片 | 欧美日韩精品 | 黄色亚洲网站 | 国产91精品久久久久久久网曝门 | 国产综合精品 | 国产成人精品久久久 | 成人精品一区二区 | 日韩精品免费看 | 亚洲日产精品 | 亚洲欧美日韩久久 | 中文字幕一区二区三区在线视频 | 懂色中文一区二区在线播放 | 亚洲一区国产精品 | 国产精品中文字幕在线 | 久久美女网 | 精品日韩在线 | 欧美日韩一区二区三区四区五区 | 国产99精品 | 97影院2| 午夜电影福利 | 成人午夜在线 | 在线视频日韩 | 成人国产免费视频 | 1区2区3区视频 | 国产精品区一区二区三区 | 国产精品久久久久久影视 | 久久久网 | 欧美日韩在线一区 | 国产超碰人人爽人人做人人爱 | 日本小电影网站 | 久久久久久成人网 | 一级全黄视频 | 久优草 | 孰女乱色一区二区三区 | 久久99精品久久久久久国产越南 | 国产一区二区日韩 | 精品一区二区在线观看 |