Php設計模式 行為型模式(一)

2021-08-27 17:39:53 字數 4793 閱讀 2305

原文詳見:

一、什麼是行為型模式?

行為型模式:

就是描述類和物件之間的通訊和職責的。簡而言之,就是類和物件扮演什麼角色,還有怎麼扮演這個角色的問題。

二、行為型模式的種類

大體上分為三個大類:常見模式、已知模式、深度模式

常見模式包括: 模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、狀態模式、職責鏈模式、策略模式

已知模式包括:備忘錄模式

深度模式包括:直譯器模式、訪問者模式

常見模式

1、模版方法模式(template):

定義乙個操作中的演算法骨架,而將一些實現步驟延遲到子類當中實現。就像乙個豆漿機,不管放進去的是紅豆還是黑豆,出來的都是豆漿。

好處:擴充套件性好,封裝不變的**,擴充套件可變的**。

弊端:靈活性差,不能改變骨架部分。

應用場景:一類或一組具有共性的事物中。

**實現

<?php

/** * 優才網公開課示例**

* * 模板方法模式 template

* * @author 優才網全棧工程師教研組

* @see

*/function output($string)

class request

}class response

public function redirect($uri)

public function json($data)

} //父類,抽象類

abstract class controller

//執行請求函式,定義總體演算法(template method),final防止被複寫(不允許子類改變總體演算法)

public final function execute()

$this->after();

}//定義hook method before,做一些具體請求的前置處理

//非abstract方法,子類可以選擇覆蓋或不覆蓋,預設什麼都不做

protected function before()

//定義hook method valid,做請求的資料驗證

//非abstract方法,子類可以選擇覆蓋或不覆蓋,預設返回驗證通過

protected function valid()

//定義hook method handlerequest,處理請求

//定義為abstract方法,子類必須實現或也宣告為抽象方法(由子類的子類負責實現)

abstract function handlerequest();

//定義hook method after,做一些請求的後置處理

//非abstract方法,子類可以選擇覆蓋或不覆蓋,預設直接輸出資料

protected function after()

}//子類1,實現父類開放的具體演算法

class user extends controller

}//覆蓋valid方法,這裡我們驗證使用者提交資料中有沒有帶驗證token

function valid()

return false;

}//覆蓋handlerequest方法,必選,以為父類中宣告了abstract了

function handlerequest()

//這個類我們選擇不覆蓋after方法,使用預設處理方式

}//子類2,實現父類開放的具體演算法

class post extends controller

//覆蓋after方法,使用json格式輸出資料

function after()

}class client

}

client::test();

2、命令模式(command) :

行為請求者與行為實現者解耦。就像軍隊裡的「敬禮」,不管是誰聽到這個命令都會做出標準的敬禮動作。

好處:便於新增和修改行為,便於聚合多個命令。

弊端:造成過多具體的命令類。

應用場景:對要操作的物件,進行的相同操作。

**實現

<?php

/** * 優才網公開課示例**

* * 命令模式 command

* * @author 優才網全棧工程師教研組

* @see

*/function output($string)

class document

public function showtext()

public function undo()

}class graphics

public function drawcircle()

public function undo()

}class client

}client::test();

<?php

/** * 優才網公開課示例**

* * 命令模式 command

* * @author 優才網全棧工程師教研組

* @see

*/function output($string)

inte***ce command

class document implements command

public function execute()

public function undo()

}class graphics implements command

public function execute()

public function undo()

}class client

$top = array_pop($array);

$top->undo();

}}client::test();

<?php

/** * 優才網公開課示例**

* * 命令模式 command

* * @author 優才網全棧工程師教研組

* @see

*/function output($string)

inte***ce command

class document

public function showtext()

public function undo()

}class graphics

public function drawcircle()

public function undo()

}class documentcommand implements command

public function execute()

public function undo()

}class graphicscommand implements command

public function execute()

public function undo()

}class client

$top = array_pop($array);

$top->undo();

}}client::test();

3、迭代器模式(iterator):

訪問聚合物件內容而不暴露內部結構。就像乙個雙色球彩票開獎一樣,每次都是搖出七個球,不能能搖不是七個球的中獎號碼組合。

好處:以不同方式遍歷乙個集合。

弊端:每次遍歷都是整個集合,不能單獨取出元素。

應用場景:需要操作集合裡的全部元素。

**實現

<?php

/** * 優才網公開課示例**

* * 迭代器模式 iterator

* * @author 優才網全棧工程師教研組

* @see

*/function output($string)

class recorditerator implements iterator

function rewind()

function current()

function key()

function next()

function valid()

}class postlistpager

public function getiterator()

public function getmaxpage()

public function getprevpage()

public function getnextpage()

}class client

output(sprintf('maxpage[%d]', $pager->getmaxpage()));

output(sprintf('prev[%d]', $pager->getprevpage()));

output(sprintf('next[%d]', $pager->getnextpage()));

$iterator = $pager->getiterator();

while($iterator->valid())

$iterator->rewind();

} }

client::test();

Php設計模式 行為型模式(三)

原文詳見 7 職責鏈模式 chainof responsibility 多個物件有機會處理請求,為請求傳送者和接收者解耦。就像銀行裡的取款機,不管那一台都可以取到錢。好處 簡單化物件隱藏鏈結構,便於新增新職責節點。弊端 請求可能沒有接受者,或者被多個接收者呼叫,效能降低。應用場景 處理多種請求。實現...

設計模式 行為型模式

行為型模式用於描述程式在執行時複雜的流程控制,即描述多個類或物件之間怎樣相互協作共同完成單個物件都無法單獨完成的任務,它涉及演算法與物件間職責的分配。行為型模式分為類行為模式和物件行為模式,前者採用繼承機制來在類間分派行為,後者採用組合或聚合在物件間分配行為。由於組合關係或聚合關係比繼承關係耦合度低...

設計模式(結構型模式 行為型模式)

一 結構型模式 1.介面卡模式 通過乙個具體類把適配者適配到目標介面中,使得原本不相容的那些類可以一起工作。舉個例子 可以把二分查詢和快排 適配者 封裝到乙個dataoperation 目標介面 介面中,再操作adapter 介面卡 來進行操作。adapter quicksort sortobj,b...