摘要:概念訪問者模式實際上是讓外部類能夠獲取樹形結構的每個節點的對象,對每個對象進行操作的模式,他能讓我們在不改動原有樹形結構的基礎上擴展功能。
概念:
訪問者模式實際上是讓外部類能夠獲取樹形結構的每個節點的對象,對每個對象進行操作的模式, 他能讓我們在不改動原有樹形結構的基礎上擴展功能。比如統計等等
在這種模式下,必須有的幾個要素:
1: 具體的元素對象, 訪問者實際要訪問的位置(即節點)
2: 穩定的樹形結構, 每個節點都是一個元素對象, 一般在組合模式下比較多, 他提供了讓訪問者能夠進行訪問的實際位置(即訪問者訪問的是具體的樹形結構的某個節點的實例化對象):
3: 訪問者接口,這里定義了訪問者的接口方法 , 這是個在每個節點都會用到的方法,用以節點處引用訪問者,從而使得訪問者能夠訪問當前節點
4: 訪問者的具體實現. 繼承了訪問者接口,以實現接口方法
(還可以加一個要素: 元素的接口,對應 要點1)
要給不同用戶組的用戶添加不同的積分。
實現://定義元素接口 abstract class User { public function getPoint() { return rand(); //該數據應該由數據庫中讀取,這里就直接模擬某個值了 } //這里的accept方法用于把訪問者引入,在這個方法里,($visitor)訪問者可以通過User類獲取需要的數據進而進行相應的操作 abstract function accept(UserVisitor $vitor); } //實現元素接口 class VipUser extends User { //這里的getPoint()具體實現就由接口中實現了 //在這里就把當前對象傳遞給了visitor 訪問者, 在訪問者類的visitVip方法中就能根據$this獲取必要的數據進行相應的操作 public function accept(UserVisitor $vitor) { $vitor->visitVip($this); } } class NormalUser extends User { //同上的getPoint()具體實現就由接口中實現了 //同VipUser類中的accept public function accept(UserVisitor $vitor) { $vitor->visitNormal($this); } } //定義訪問者接口 abstract class UserVisitor { //訪問者必須要實現的訪問不同用戶的接口方法 abstract function visitVip(User $user); abstract function visitNormal(User $user); } //積分操作的訪問者實現 class PointActVisitor extends UserVisitor { public function visitVip(User $user) { echo "Vip用戶+10分 "; } public function visitNormal(User $user) { echo "Normal用戶+5分"; } } //用戶的樹形結構 class Users { protected $users; public function addUser(User $user) { $this->users[] = $user; } //讓所有的用戶都能被訪問者訪問 public function handleVisitor(UserVisitor $visitor) { foreach($this->users as $user) { $user->accept($visitor); } } } $pointVisitor = new PointActVisitor(); $users = new Users(); $users->addUser(new VipUser()); //添加新用戶 $users->addUser(new NormalUser()); $users->addUser(new NormalUser()); $users->handleVisitor($pointVisitor); //執行PointActVisitor訪問者的操作結果:
Vip用戶+10分 Normal用戶+5分 Normal用戶+5分
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/20854.html
摘要:概念迭代器模式,又叫做游標模式。另外,當需要對聚集有多種方式遍歷時,可以考慮去使用迭代器模式。迭代器模式為遍歷不同的聚集結構提供如開始下一個是否結束當前哪一項等統一的接口。 概念 迭代器模式(Iterator),又叫做游標(Cursor)模式。提供一種方法順序訪問一個聚合對象中的各種元素,而又不暴露該對象的內部表示。 當你需要訪問一個聚合對象,而且不管這些對象是什么都需要遍歷的時候,就...
摘要:訪問者模式解決的問題在我們的代碼編寫過程當中,經常需要對一些類似的對象添加一些的代碼,我們以一個計算機對象打印組成部分為例來看下抽象基類獲取名稱類內存類鍵盤類計算機類循環打印各個組成部分這個時候上面的代碼看上去好像很完美的樣子,但是問 訪問者模式解決的問題 在我們的代碼編寫過程當中,經常需要對一些類似的對象添加一些的代碼,我們以一個計算機對象打印組成部分為例來看下: /** ...
摘要:設計模式系列之入門設計模式是一套被反復使用多數人知曉的經過分類編目的代碼設計經驗的總結。毫無疑問,設計模式于己于他人于系統都是多贏的設計模式使代碼編制真正工程化設計模式是軟件工程的基石脈絡,如同大廈的結構一樣。 PHP設計模式系列之入門 設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易...
摘要:事實上,設計模式的解釋如下另一方面,設計模式提供了一種廣泛的可重用的方式來解決我們日常編程中常常遇見的問題。原型模式有些時候,部分對象需要被初始化多次。 本文為翻譯文章 原文地址:Design Patterns in PHP如果打算學習PHP的童鞋可以參考下筆者的編程語言學習知識體系要點列表 本文主要討論下Web開發中,準確而言,是PHP開發中的相關的設計模式及其應用。有經驗的開發者肯...
閱讀 2434·2021-11-18 10:02
閱讀 693·2021-10-08 10:04
閱讀 2263·2021-09-03 10:51
閱讀 3549·2019-08-30 15:44
閱讀 2806·2019-08-29 14:09
閱讀 2471·2019-08-29 12:21
閱讀 2068·2019-08-26 13:45
閱讀 1810·2019-08-26 13:25