日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

设计模式(十四)命令

發布時間:2023/11/25 windows 31 coder
生活随笔 收集整理的這篇文章主要介紹了 设计模式(十四)命令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、定義

將一個請求封裝為一個對象,從而可以用不同的請求對客戶進行參數化,對請求排隊或者記錄請求日志,以及支持可撤銷的操作。命令模式是一種對象行為型模式,其別名為動作(Action)模式或事物(Transaction)模式。

二、描述

命令模式的本質是對請求進行封裝,一個請求對應一個命令,將發出命令的責任和執行命令的責任分割開,使得請求的一方不必了解接收請求的一方的接口,更不必知道請求如何被接收、操作是否被執行、何時被執行,以及是怎么被執行的。包含以下四個角色:
1、Command(抽象命令類):抽象命令類一般是一個抽象類或接口,在其中聲明了用于執行請求的Execute()方法,通過這些方法可以調用請求接收者的相關操作。
2、ConcreteCommand(具體命令類):具體命令類是抽象命令類的子類,實現了抽象命令類中聲明的方法,它對應具體的接收者對象,將接收者對象的動作綁定其中。具體命令類在實現Execute()方法時,將調用接收者對象的相關操作(Action)。
3、Invoker(調用者):調用者即請求發送者,它通過命令對象來執行請求。一個調用者不需要在設計時確定其接收者,因此只與抽象命令之間存在關聯關系。在程序運行時可以將一個具體命令對象注入其中,再調用具體命令對象的Execute()方法,從而實現簡介調用請求接收者的相關命令。
4、Receiver(接收者):接收者執行與請求相關的操作,具體實現對請求的業務處理。

三、例子

X公司開發人員開發了一個桌面版應用程序,該應用程序為員工提供了一系列自定義功能鍵,通過這些功能鍵來實現一些快捷操作,例如:“打開幫助文檔”、“最小化至托盤”、“自動截屏”等。
FBSettingWindow:“功能鍵設置”界面類,充當客戶端

public class FBSettingWindow
{
    // 窗口標題
    public string Title { get; set; }
    // 所有功能鍵集合
    private IList<FunctionButton> functionButtonList = new List<FunctionButton>();

    public FBSettingWindow(string title)
    {
        this.Title = title;
    }

    public void AddFunctionButton(FunctionButton fb)
    {
        functionButtonList.Add(fb);
    }

    public void RemoveFunctionButton(FunctionButton fb)
    {
        functionButtonList.Remove(fb);
    }

    // 顯示窗口及功能鍵
    public void Display()
    {
        Console.WriteLine("顯示窗口:{0}", this.Title);
        Console.WriteLine("顯示功能鍵:");

        foreach (var fb in functionButtonList)
        {
            Console.WriteLine(fb.Name);
        }

        Console.WriteLine("------------------------------------------");
    }
}

FunctionButton:請求發送類,充當調用者

public class FunctionButton
{
    // 功能鍵名稱
    public string Name { get; set; }
    // 維持一個抽象命令對象的引用
    private Command command;

    public FunctionButton(string name)
    {
        this.Name = name;
    }

    // 為功能鍵注入命令
    public void SetCommand(Command command)
    {
        this.command = command;
    }

    // 發送請求的方法
    public void OnClick()
    {
        Console.WriteLine("點擊功能鍵:");
        if (command != null)
        {
            command.Execute();
        }
    }
}

Command:抽象命令類

public abstract class Command
{
    public abstract void Execute();
}

HelpCommand、MinimizeCommand:幫助類、最小化類,充當具體命令類

public class HelpCommand : Command
{
    private HelpHandler hander;

    public HelpCommand()
    {
        hander = new HelpHandler();
    }

    // 命令執行方法,將調用請求接受者的業務方法
    public override void Execute()
    {
        if (hander != null)
        {
            hander.Display();
        }
    }
}

public class MinimizeCommand : Command
{
    private WindowHandler handler;

    public MinimizeCommand()
    {
        handler = new WindowHandler();
    }

    // 命令執行方法,將調用請求接受者的業務方法
    public override void Execute()
    {
        if (handler != null)
        {
            handler.Minimize();
        }
    }
}

WindowHandler、HelpHandler:最小化處理類、幫助處理類,充當接收者

public class WindowHandler
{
    public void Minimize()
    {
        Console.WriteLine("正在最小化窗口至托盤...");
    }
}

public class HelpHandler
{
    public void Display()
    {
        Console.WriteLine("正在顯示幫助文檔...");
    }
}

Program:客戶端測試類

//Step1.模擬顯示功能鍵設置窗口
FBSettingWindow window = new FBSettingWindow("功能鍵設置窗口");

// Step2.假如目前要設置兩個功能鍵
FunctionButton buttonA = new FunctionButton("功能鍵A");
FunctionButton buttonB = new FunctionButton("功能鍵B");

// Step3.讀取配置文件和反射生成具體命令對象
Command commandA = new HelpCommand();
Command commandB = new MinimizeCommand();

// Step4.將命令注入功能鍵
buttonA.SetCommand(commandA);
buttonB.SetCommand(commandB);

window.AddFunctionButton(buttonA);
window.AddFunctionButton(buttonB);
window.Display();

// Step5.調用功能鍵的業務方法
buttonA.OnClick();
buttonB.OnClick();
Console.ReadLine("");

四、總結

1、優點

(1)降低了系統的耦合度,了系統的耦合度。由于請求者與接收者之間不存在直接引用,因此請求者與接收者之間實現了完全解耦,相同的請求者可以對應不同的接收者,同樣,相同的接收者也可以供不同的請求者使用,兩者之間具有良好的獨立性。
(2)通過使用命令模式,新的命令可以很容易地加入到系統中。由于增加新的具體命令類不會影響其他類,所以增加新的具體命令類很容易,無須修改原有系統源代碼,甚至客戶類代碼,滿足開閉原則的要求。
(3)使用命令模式可以比較容易地設計一個命令隊列或宏命令(組合命令)。
(4)命令模式為請求的撤銷(Undo)和恢復(Redo)操作提供了一種設計和實現方案。

2、缺點

(1)使用命令模式可能會導致某些系統有過多的具體命令類,因為針對每一個對請求接收者的調用操作都需要設計一個具體命令,所以在某些系統中可能需要提供大量的具體命令類,這將影響命令模式的使用。

總結

以上是生活随笔為你收集整理的设计模式(十四)命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。