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

詳解command設計模式,解耦操作和回滾

開發 前端
今天我們介紹的設計模式叫做命令模式(command),在這個模式下,我們可以實現do和undo的解耦,讓使用方不用關心內部的實現細節。

今天我們介紹的設計模式叫做命令模式(command),在這個模式下,我們可以實現do和undo的解耦,讓使用方不用關心內部的實現細節。

command模式

這個模式我們在日常當中經常使用,舉一個很簡單的例子,比如說我們發布代碼。發布了之后發現不小心發布上去了一個bug,這個時候我們應該做什么?很簡單,就是回滾,把線上的代碼回滾到這一次發布之前的代碼。這樣我們這次發布帶來的改動就會被消除,那么就避免了bug的產生。

那么,對于一個發布系統來說,它需要做什么?其實也就是兩個功能,一個是發布另外一個是回滾。這兩個操作是互相可逆的,對于它的使用者來說,是不會關心它的內部是如何實現的,我們只需要在頁面上按按鈕就好了。

我們來回顧一下這個過程,我們點擊發布,可以把最新的代碼發布上線。發布之后發現問題,再點擊回滾,系統再自動恢復到發布之前的狀態。發布和回滾彼此是可逆的,當我們消除掉bug之后,再次點擊發布,又可以再次發布最新的代碼了。

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

假如我們發現改名字改錯了,想回滾怎么辦呢?會發現我們改動之前的名字已經忘了,不知道怎么回滾了。這個時候就可以使用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方法當中,我們把文件從src變成了dest,如果想要回滾,它又會再次調用rename。將文件名從dest回滾到src。這樣的話,作為使用方就可以完全不用理解api內部的實現邏輯了,不然的話為了防止改錯了的情況,還需要做很多適配。

menu item

有了command模式之后我們可以在外面在封裝一層用來ui交互上,我們很常見的一種UI交互方式就是按鈕。某一個按鈕點一下之后會出現一個按過的標記,并且實現一個什么功能。再按一次標記消失,功能也隨之關閉。

我隨便找了一個例子,比如下圖菜單當中的show minimap,show breadcrumbs這些都是這樣的功能。點一下出現縮略圖,再點一下縮略圖消失。

 

詳解command設計模式,解耦操作和回滾

如果你寫過UI頁面的話,一般來說我們會先定義一個Menu Item的類,表示菜單當中的所有的item的基類。不同的選項表示不同的item,我們進一步分析會發現有些item我們需要這樣雙擊關閉的機制,而有些item是沒有的。比如上面的Run、Output這些item都是點一次執行一次的。

我們當然可以把上面介紹的Command對象直接當做item,但是這樣不利于整個菜單的統一,所以我們還會在外面包一層。比如所有MenuItem的父類應該是這樣的:

 

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

有了這個基類之后,我們就可以實現一個可回滾的類,將command的對象作為類成員變量,再在其中實現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解耦了,如果我們想要實現不同的可以回滾的功能, 只需要實現不同的command創建實例就可以了。對于整個UI的使用沒有任何影響,UI組件當中用到的所有類都是統一的。可能在Python這種弱類型語言當中看不太出來,因為我們一個list說是menu基類的list,但是其實裝什么都行。但如果是強類型語言,那么這種抽象和封裝就是非常有必要的了。

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2023-02-28 09:10:28

設計模式解耦數據

2023-03-03 08:12:07

設計模式語言

2021-03-10 05:50:06

IOCReact解耦組件

2017-05-18 16:07:23

回滾數據庫代碼

2022-04-15 11:46:09

輕量系統解耦鴻蒙操作系統

2021-01-07 10:30:23

設計模式

2022-09-02 08:23:12

軟件開發解耦架構

2012-12-26 09:36:45

MySQLDelete

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

架構工具和方案

2025-03-13 09:22:39

2025-05-07 03:22:00

2022-07-13 08:36:57

MQ架構設計模式

2025-02-11 07:55:45

2020-11-20 15:22:32

架構運維技術

2025-05-20 07:13:22

Spring異步解耦Event

2024-03-08 16:27:22

領域事件DDD項目跨層解耦

2021-06-29 08:54:23

設計模式代理模式遠程代理

2009-07-28 10:21:05

自定義Command

2018-04-18 08:47:17

Alluxio構建存儲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区2区三区4区公司二百 | 精品国产久 | 伊人久久在线 | 中文字幕91av | 99热这里都是精品 | 欧美性高潮 | 在线观看精品 | 久久精品视频一区二区 | 亚洲一区二区三区在线 | 午夜影院视频在线观看 | 精品视频在线免费观看 | 日本手机在线 | 欧美精品一区在线发布 | 精品产国自在拍 | 最新av在线播放 | 亚洲视频精品 | 欧美国产日韩在线观看 | 中文字幕中文字幕 | 欲色av | 久久天天综合 | 中文字幕在线免费视频 | 超碰在线人 | 国产一区中文字幕 | 国产精品美女久久久久久久久久久 | 黄网站在线播放 | 一区二区精品视频 | 福利在线观看 | 欧美 日韩 国产 一区 | 成人小视频在线观看 | 中文字幕三区 | 综合自拍| 麻豆久久久久久久 | 日韩精品免费一区 | 精品国产一区二区国模嫣然 | 一级一片在线观看 | 久久久久国产一区二区三区 | 91久久| 国产欧美在线播放 | 欧美一区二区大片 | 亚洲最新在线 | 91在线电影 |