命令模式再學習

2021-06-23 00:35:08 字數 2613 閱讀 3915

以前也寫過設計模式,總是羅列一些自己都看不懂的話。一直都認為要想對設計模式有很好的理解,離不了實踐的經驗和不斷的學習總結。這次是結合自己的理解並且本著通俗易懂的原則來寫,適合入門級學習的人。

有這麼一種情況:在vs中。新建乙個cs專案,按下f5執行,出現了乙個窗體;又新建了乙個bs專案,同樣按下f5,這時執行時出現的是瀏覽器的頁面。問題來了,在不同的應用環境下,按下同乙個按鈕,卻出現了不同的執行結果。如果你是開發人員,你會如何實現?

最糟糕的設計也不過是每乙個動作都重新實現一遍,但是你想一想,vs中有多少這樣的功能,如果要是乙個乙個的實現,那多麻煩,維護起來更是可怕。針對於這樣的一種情況,可以使用命令模式。我們都知道所有的設計模式無非就是為了解耦,命令模式是怎麼解耦的?適合在哪些情況下使用?

命令模式的核心在於將動作的請求者從動作的執行者中解耦。先看一張類圖:

這是《大話設計模式》中講烤羊肉串的例子的類圖。就以它來講:以前是客戶端和烤肉串者緊密耦合,為了解耦在兩者之間加入了」第三者」---服務員類和命令類。客戶端持有服務員的引用,通過設定命令方法發出請求。通過通知執行方法告訴命令類去執行。而命令類和烤肉串類對動作的執行進行了封裝,通過服務員傳入不同引數,決定具體使用哪個命令,然後直接執行命令。這樣就實現了動作的請求和動作的執行的分離。

這樣解耦後有什麼好處?

1. 如果另外需要幾串烤牛板筋的話,就不需要修改類,直接在新增烤牛板筋類來繼承命令類。(開閉原則:對擴充套件是開放的,對修改是關閉)

3. 可以容易地實現redo 和 undo 操作。

應用命令模式的具體例項實現redo 和 undo 操作。c#的控制台程式模擬:

calculator相當於烤肉串者

/*

*建立人:王雅瑾

*建立日期:2014/7/31 11:01:43

*說明:

*/using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace calculator

console.writeline("current value = (following )",

_curr, @operator, operand);}}

}

command相當於命令

/*

*建立人:王雅瑾

*建立日期:2014/7/31 10:47:24

*說明:

*/using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace calculator

class calculatorcommand : command

public char operator

}public int operand

}public override void execute()

public override void unexecute()

private char undo(char @operator)}}

}

user相當於是服務員

/*

*建立人:王雅瑾

*建立日期:2014/7/31 11:10:33

*說明:

*/using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace calculator

levels ", levels);

for (int i = 0; i < levels; i++)}}

public void undo(int levels)

levels ", levels);

for (int i = 0; i < levels; i++)}}

public void compute(char @operator, int operand)}}

program相當於客戶端類

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace calculator}}

思考:命令模式和組合模式一起實現巨集命令類

命令模式和備忘錄模式一起撤退和重做的操作。

總結:有了理論之後多加實踐才能真正理解設計模式。

設計模式 再學習

理解 原則 構造器模式 function user name age,career const user newuser name,age,career 簡單工廠模式 每個物件例項的變與不變 那麼使用工廠模式時,我們要做的就是去抽象不同建構函式 類 之間的變與不變 user 的 work 根據傳進來...

設計模式再學習(上)

理解設計模式前的前堤 1 模式的應用目標是把可維護性作為很重要指標的程式,像一次性的demo程式就不需要多高的可維護性 2 意識到並認可面向介面程式設計的好處,不認可請回看1 3 設計模式的本質是解耦,解耦的根本手段是分層,分的層越多,關係越不直觀 4 不用設計模式完全不影響實現需求,只是寫的 多了...

設計模式之單例模式 學習學習再學習

基本類 package com.patterns.singleton public class singleton public static singleton getsingleton return s public static void delsingleton 測試類 package co...