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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式心得:三——命令模式

發(fā)布時間:2023/11/29 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式心得:三——命令模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

繼續(xù)設(shè)計模式心得體驗——命令模式。

命令模式:?將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請求排隊或記錄請求日志,以及支持可撤銷的操作。

一般在命令模式中有三個元素,invoker、command、receive。command?是一個抽象類或者也可以是個接口,它封裝了一個execute方法,一般在command初始化的時候接受一個receive參數(shù),而execute就是執(zhí)行該receive的某些方法。invoker是請求者,它自身可以存儲一個或者一組command的子類,然后在某種情況下按順序執(zhí)行這些command的execute方法。當(dāng)然你也就可以記錄下這些命令,或者撤銷。invoker就不需要知道receive怎么做的它只需要知道command有execute方法就行了,不管它是怎么做的,這樣就和receive解耦了。

在生活中的命令模式很多,比如你去餐館吃飯,服務(wù)員給你拿了菜單,你寫下幾個菜,服務(wù)員將你點的菜記下來,然后交給廚師去做,在這其中,服務(wù)員就扮演invoker的角色,他不需要知道廚師怎么燒菜的,他只要將訂單(command組)交給廚師就好。

命令模式一般被用來解決類似隊列,記錄日志,有撤銷操作等類型的問題,invoker是這個核心,它能保證命令的有序執(zhí)行并且可以記錄下他們或者撤銷操作,而不需要管這些命令是什么,只要是繼承了command命令就行。

從這個模式中我學(xué)到了,封裝的好處和抽象(或者說接口),用抽象或者接口定義的execute保證了invoker每次調(diào)用command的子類時execute都不會出錯,所以invoker可以保證隊列,日志的正常運(yùn)行或撤銷,而封裝好了的execute方法讓invoker與具體實現(xiàn)解耦,不用管到底它是怎么實現(xiàn)的。

下面貼下該模式的代碼:

?

代碼 <?php
//抽象命令類
abstract class Command {
protected $_r;

public function __construct(Receiver $r)
{
$this->_r = $r;
}

abstract public function execute();
}

//接受命令者(真正的執(zhí)行者)
class Receiver {
private $_name;

//這里初始化不同的接受者
function __construct($name)
{
$this->_name = $name;
}

function kaoyrc()
{
echo $this->_name . '在烤羊肉串<br />';
}

function kaojc()
{
echo $this->_name . '在烤雞翅<br />';
}
}

class Invoker {
private $_commands = array();

function setCommand(Command $cmd)
{
$this->_commands[] = $cmd;
}

function execute()
{
foreach ($this->_commands as $cmd)
{
$cmd->execute();
}
}
}

//這個是烤羊肉串的命令
class kaoyrcCommand extends Command {
public function execute()
{
$this->_r->kaoyrc();
}
}
//這個是考雞翅的命令
class kaojcCommand extends Command {
public function execute()
{
$this->_r->kaojc();
}
}

$zs = new Receiver('張三'); //初始化接受者張三
$ls = new Receiver('李四'); //初始化接受者李四

$waiter = new Invoker(); //創(chuàng)建服務(wù)員

$zskaoyrc = new kaoyrcCommand($zs); //創(chuàng)建讓張三烤羊肉串的命令
$zskaojc = new kaojcCommand($zs); //創(chuàng)建讓張三烤雞翅的命令
$lskaojc = new kaojcCommand($ls); //創(chuàng)建讓李四烤雞翅的命令

//將命令報給服務(wù)員讓他處理

$waiter->setCommand($zskaoyrc);
$waiter->setCommand($zskaojc);
$waiter->setCommand($lskaojc);

$waiter->execute(); //將命令組報給接受者(解決者)

?>

// 結(jié)果
// 張三在烤羊肉串
// 張三在烤雞翅
// 李四在烤雞翅

?

轉(zhuǎn)載于:https://www.cnblogs.com/cl51287/archive/2010/10/14/1851703.html

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。