亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解command設計模式

發布時間:2021-10-26 11:47:53 來源:億速云 閱讀:119 作者:iii 欄目:web開發

本篇內容介紹了“如何理解command設計模式”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

command模式

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

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

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

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

假如我們發現改名字改錯了,想回滾怎么辦呢?會發現我們改動之前的名字已經忘了,不知道怎么回滾了。這個時候就可以使用command模式,我們來看代碼:

import os  class MoveFileCommand:      def __init__(self, src, dest):         self.src = src         self.dest = dest      def execute(self):         self.rename(self.src, self.dest)      def undo(self):         self.rename(self.dest, self.src)      def rename(self, src, dest):         print('renaming from {} to {}'.format(src, dest))         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的父類應該是這樣的:

class MenuItemBaseClass:     def __init__(self):         pass          def pressed(self):         pass          def unpress(self):         pass

有了這個基類之后,我們就可以實現一個可回滾的類,將command的對象作為類成員變量,再在其中實現unpress方法:

class RedoableMenu(MenuItemBaseClass):     def __init__(self, command):         self_command = command              def pressed(self):         self._command.execute()              def unpress(self):         self._command.undo()

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

“如何理解command設計模式”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

砚山县| 新巴尔虎左旗| 云阳县| 凯里市| 呈贡县| 梁河县| 建水县| 遂平县| 灯塔市| 柳江县| 饶河县| 南江县| 如东县| 开远市| 肇庆市| 潍坊市| 容城县| 上高县| 林甸县| 青河县| 汉中市| 平邑县| 手游| 高邮市| 仁寿县| 宜兰县| 上虞市| 清丰县| 嘉祥县| 浮梁县| 临澧县| 武城县| 于都县| 七台河市| 慈溪市| 宿松县| 厦门市| 临猗县| 馆陶县| 泾川县| 蕉岭县|