国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

js設(shè)計(jì)模式 --- 命令設(shè)計(jì)模式

iflove / 1793人閱讀

摘要:命令設(shè)計(jì)模式涉及三類(lèi)對(duì)象抽象命令類(lèi)抽象命令類(lèi)一般是一個(gè)抽象類(lèi)或接口,在其中聲明了用于執(zhí)行請(qǐng)求的等方法,通過(guò)這些方法可以調(diào)用請(qǐng)求接收者的相關(guān)操作。

命令模式
命令模式定義為:Encapsulate a request as an object,there by letting you parameterize clients with different requests,queue or log requests,and support undoable operations.

命令模式是一個(gè)高內(nèi)聚的模式,將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而讓你使用不同的請(qǐng)求把客戶(hù)端參數(shù)化,對(duì)請(qǐng) 求排隊(duì)或者記錄請(qǐng)求日志,可以提供命令的撤銷(xiāo)和恢復(fù)功能.

在軟件開(kāi)發(fā)中,我們經(jīng)常需要向某些對(duì)象發(fā)送請(qǐng)求(調(diào)用其中的某個(gè)或某些方法),但是并不知道請(qǐng)求的接收者是誰(shuí),也不知道被請(qǐng)求的操作是哪個(gè),此時(shí),我們特別希望能夠以一種松耦合的方式來(lái)設(shè)計(jì)軟件,使得請(qǐng)求發(fā)送者與請(qǐng)求接收者能夠消除彼此之間的耦合,讓對(duì)象之間的調(diào)用關(guān)系更加靈活,可以靈活地指定請(qǐng)求接收者以及被請(qǐng)求的操作。命令模式為此類(lèi)問(wèn)題提供了一個(gè)較為完美的解決方案。命令模式可以將請(qǐng)求發(fā)送者和接收者完全解耦,發(fā)送者與接收者之間沒(méi)有直接引用關(guān)系,發(fā)送請(qǐng)求的對(duì)象只需要知道如何發(fā)送請(qǐng)求,而不必知道如何完成請(qǐng)求。

使用場(chǎng)景

系統(tǒng)需要將請(qǐng)求調(diào)用者和請(qǐng)求接收者解耦,使得調(diào)用者和接收者不直接交互。請(qǐng)求調(diào)用者無(wú)須知道接收者的存在,也無(wú)須知道接收者是誰(shuí),接收者也無(wú)須關(guān)心何時(shí)被調(diào)用。

系統(tǒng)需要在不同的時(shí)間指定請(qǐng)求和執(zhí)行請(qǐng)求。一個(gè)命令對(duì)象和請(qǐng)求的初始調(diào)用者可以有不同的生命期,換言之,最初的請(qǐng)求發(fā)出者可能已經(jīng)不在了,而命令對(duì)象本身仍然是活動(dòng)的,可以通過(guò)該命令對(duì)象去調(diào)用請(qǐng)求接收者,而無(wú)須關(guān)心請(qǐng)求調(diào)用者的存在性,可以通過(guò)請(qǐng)求日志文件等機(jī)制來(lái)具體實(shí)現(xiàn)。

系統(tǒng)需要支持命令的撤銷(xiāo)(Undo)操作和恢復(fù)(Redo)操作。

系統(tǒng)需要將一組操作組合在一起形成宏命令。

命令設(shè)計(jì)模式涉及三類(lèi)對(duì)象

Command(抽象命令類(lèi))
抽象命令類(lèi)一般是一個(gè)抽象類(lèi)或接口,在其中聲明了用于執(zhí)行請(qǐng)求的execute()等方法,通過(guò)這些方法可以調(diào)用請(qǐng)求接收者的相關(guān)操作。

ConcreteCommand(具體命令類(lèi))
具體命令類(lèi)是抽象命令類(lèi)的子類(lèi),實(shí)現(xiàn)了在抽象命令類(lèi)中聲明的方法,它對(duì)應(yīng)具體的接收者對(duì)象,將接收者對(duì)象的動(dòng)作綁定其中。在實(shí)現(xiàn)execute()方法時(shí),將調(diào)用接收者對(duì)象的相關(guān)操作(Action)。

Invoker(調(diào)用者)--也可以有接口類(lèi)
調(diào)用者即請(qǐng)求發(fā)送者,它通過(guò)命令對(duì)象來(lái)執(zhí)行請(qǐng)求。一個(gè)調(diào)用者并不需要在設(shè)計(jì)時(shí)確定其接收者,因此它只與抽象命令類(lèi)之間存在關(guān)聯(lián)關(guān)系。在程序運(yùn)行時(shí)可以將一個(gè)具體命令對(duì)象注入其中,再調(diào)用具體命令對(duì)象的execute()方法,從而實(shí)現(xiàn)間接調(diào)用請(qǐng)求接收者的相關(guān)操作。

Receiver(接收者)
接收者執(zhí)行與請(qǐng)求相關(guān)的操作,它具體實(shí)現(xiàn)對(duì)請(qǐng)求的業(yè)務(wù)處理。

結(jié)構(gòu)

實(shí)現(xiàn)

Command(抽象命令類(lèi))

// 命令模式
let ICommend = new Interface("ICommend", ["execute","undo"])

ConcreteCommand(具體命令類(lèi))

let LightOnCommand = function (light) {
  this.light = light;
};
LightOnCommand.prototype.execute = function () {
  light.on();
};
LightOnCommand.prototype.undo = function () {
  light.off();
};

let TVOnCommand = function (tv) {
  this.tv = tv;
};
TvOnCommand.prototype.execute = function () {
  tv.on();
};
TvOnCommand.prototype.undo = function () {
  tv.off();
};

Invoker(調(diào)用者)

let IPhone = function () {
  this.commands = [];
};

IPhone.prototype.setCommand = function (command) {
  this.commands.push(command);
};

IPhone.prototype.onButtonWasPushed = function (slot) {
  this.commands[slot-1].execute();
};

Receiver(接收者)

let IHouseApplication = new Interface("IHouseApplication", ["on","off"]);

Receiver(接收者)--也可以有接口類(lèi)

let TV  = function () {
};
TV.prototype.on = function() {
  System.out.println("the TV on");
};
TV.prototype.off = function() {
  System.out.println("the TV off");
};
let Light  = function () {
};
Light.prototype.on = function() {
  System.out.println("the Light on");
};
Light.prototype.off = function() {
  System.out.println("the Light off");
};

調(diào)用
let miPhone = new IPhone();
//創(chuàng)建電器
let light = new Light();
let tv = new TV();
//創(chuàng)建命令
let lightOnCommand = new LightOnCommand(light);
let tvOnCommand = new TVOnCommand(tv);
//給手機(jī)設(shè)置命令
//設(shè)置第一個(gè)按鈕為開(kāi)燈
miPhone.setCommand(lightOnCommand);
//設(shè)置第二個(gè)按鈕為開(kāi)電視
miPhone.setCommand(tvOnCommand);

//開(kāi)燈
miPhone.onButtonWasPushed(1);
//開(kāi)電視
miPhone.onButtonWasPushed(2);

優(yōu)點(diǎn)

類(lèi)間解耦:調(diào)用者角色與接收者角色之間沒(méi)有任何依賴(lài)關(guān)系,調(diào)用者實(shí)現(xiàn)功能時(shí)只需調(diào)用Command 抽象類(lèi)的execute方法就可以,不需要了解到底是哪個(gè)接收者執(zhí)行。

可擴(kuò)展性:Command的子類(lèi)可以非常容易地?cái)U(kuò)展,而調(diào)用者Invoker和高層次的模塊Client不產(chǎn)生嚴(yán) 重的代碼耦合。

命令模式結(jié)合其他模式會(huì)更優(yōu)秀:命令模式可以結(jié)合責(zé)任鏈模式,實(shí)現(xiàn)命令族解析任務(wù);結(jié)合模板方法模式,則可以減少 Command子類(lèi)的膨脹問(wèn)題。

缺點(diǎn)

命令模式也是有缺點(diǎn)的,請(qǐng)看Command的子類(lèi):如果有N個(gè)命令,問(wèn)題就出來(lái) 了,Command的子類(lèi)就可不是幾個(gè),而是N個(gè),這個(gè)類(lèi)膨脹得非常大,這個(gè)就需要讀者在項(xiàng) 目中慎重考慮使用。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/92874.html

相關(guān)文章

  • js設(shè)計(jì)模式--命令模式

    摘要:中的命令模式點(diǎn)擊按鈕刷新菜單目錄設(shè)置背景色的例子撤銷(xiāo)命令我們現(xiàn)在來(lái)實(shí)現(xiàn)一個(gè)撤銷(xiāo)操作的例子界面上有四個(gè)按鈕,三個(gè)可以設(shè)置不同的背景色,按鈕可以撤銷(xiāo)上一次的操作重做操作這里我們?cè)黾右粋€(gè)按鈕,以恢復(fù)之前的操作,需要一個(gè)來(lái)記錄當(dāng)前的索引 前言 本系列文章主要根據(jù)《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》整理而來(lái),其中會(huì)加入了一些自己的思考。希望對(duì)大家有所幫助。 文章系列 js設(shè)計(jì)模式--單例模...

    Bryan 評(píng)論0 收藏0
  • 基于Web的svg編輯器(1)——撤銷(xiāo)重做功能

    摘要:撤銷(xiāo)重做是一款編輯器的基礎(chǔ)功能,它讓用戶(hù)在進(jìn)行錯(cuò)誤操作后,可以讓編輯器回滾到錯(cuò)誤操作前的狀態(tài)。選擇實(shí)現(xiàn)方案基于對(duì)象序列化的實(shí)現(xiàn)功能,其中一個(gè)方法是基于對(duì)象序列化的。示例編輯器的撤銷(xiāo)重做功能使用了這種模式。 最近在做一個(gè)網(wǎng)頁(yè)版的 svg 編輯器,為此學(xué)習(xí)了編輯器相關(guān)方面的知識(shí)。本文是我的一些粗淺學(xué)習(xí)總結(jié),希望可以給初學(xué)者一些思路。 前面的話 隨著近幾年前端技術(shù)的快速發(fā)展,人們更傾向于將應(yīng)...

    Jaden 評(píng)論0 收藏0
  • 前端應(yīng)該掌握的linux命令和工具

    摘要:大部分前端應(yīng)用都部署在上,若想全局住一個(gè)項(xiàng)目,命令是一項(xiàng)必不可少的技能。編輯器命令非常強(qiáng)大,掌握最最基本的就可以解決問(wèn)題了。命令模式下接受命令輸入且顯示在終端,回車(chē)生效。常見(jiàn)的命令有,退出,強(qiáng)制退出,保存,保存并退出。 大部分前端應(yīng)用都部署在linux上,若想全局hold住一個(gè)項(xiàng)目,linux命令是一項(xiàng)必不可少的技能。許多前端對(duì)linux命令并不重視,其實(shí)這是一個(gè)學(xué)習(xí)性?xún)r(jià)比非常高的知識(shí)...

    tuantuan 評(píng)論0 收藏0
  • 從零開(kāi)始打造個(gè)人專(zhuān)屬命令行工具集——yargs完全指南

    摘要:自阮大神的文章發(fā)布以來(lái),有了一些改動(dòng),添加有很多有用的功能,特別是這個(gè)功能,對(duì)打造命令行工具集合非常有用,所以寫(xiě)一個(gè)新版本的教程還是有必要的。 前言 使用命令行程序?qū)Τ绦騿T來(lái)說(shuō)很常見(jiàn),就算是前端工程師或者開(kāi)發(fā)gui的,也需要使用命令行來(lái)編譯程序或者打包程序 熟練使用命令行工具能極大的提高開(kāi)發(fā)效率,linux自帶的命令行工具都非常的有用,但是這些工具都是按照通用需求開(kāi)發(fā)出來(lái)的,如果有一些...

    wanghui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<