熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

php設計模式介紹之迭代器模式

2013-11-13 10:15:39  來源: .NET編程 

  《PHP設計模式介紹》第八章 迭代器模式

  類中的面向對象編程封裝應用邏輯就是實例化的對象每個單獨的對象都有一個特定的身份和狀態單獨的對象是一種組織代碼的有用方法但通常你會處理一組對象或者集合

  屬性來自 SQL 查詢的一組數據就是一個集合就像本書前面章節介紹的 Monopoly 游戲示例的對象列表

  集合不一定是均一的圖形用戶界面框架中的 Window 對象可以收集任意數量的控制對象 - MenuSlider 和 Button並且集合的實現可以有多種方式PHP 數字是一個集合但也是一個散列表一個鏈接列表一個堆棧以及隊列

  問題

  如何操縱任意的對象集合?

  解決方案

  使用迭代器模式來提供對集合內容的統一存取

  你可能沒有意識到這一點但你每天都在使用迭代器模式 - 它潛藏在 PHP 的數組類型和各種數組操作函數中(其實給你一些固有類的數組的組合和一群用這些固有類工作的可變函數你將不得不使用這些數組來處理對象集合這是在 PHP 中的本地數組迭代

  $test  =  array(one  two  three);
$output  =  ; reset($test);
do  {
$output  =  current($test);
}  while  (next($test));
echo  $output;  //  produces  onetwothree

  reset() 函數將迭代重新轉到數組的開始current() 返回當前元素的值next() 則前進至數組中的下一個元素並返回新的 current() 值當你超出數組的最後一個元素時next() 返回 false使用這些迭代方法PHP 數組的內部實現就與你不相關了迭代器結合了封裝和多態的面向對象程序設計原理使用迭代器你可以對集合中的對象進行操作而無需專門了解集合如何顯現或者集合包含什麼(對象的種類)迭代器提供了不同固定迭代實現的統一接口它完全包含了如何操縱特定集合的詳細信息包括顯示哪些項(過濾)及其顯示順序(排序)

  讓我們創建一個簡單的對象在數組中對它進行操作(盡管該示例在 PHP 環境下但迭代器並不特定於 PHP雖然添加了較多的引用操作符本章節中的大多數示例在 PHP 下也能夠運行)對象 Lendable 表示諸如電影相冊等媒體它作為 Web 站點的一部分或服務允許用戶浏覽或將他們的媒體集合分享給其他用戶(對        於該示例請無需考慮其他方面)讓我們開始下面對 Lendable 基礎設計的測試

  //  PHP
class  LendableTestCase  extends  UnitTestCase  {
function  TestCheckout()  {
$item  =  new  Lendable;
$this>assertFalse($item>borrower);
$item>checkout(John);
$this>assertEqual(borrowed  $item>status);
$this>assertEqual(John  $item>borrower);
}
function  TestCheckin()  {
$item  =  new  Lendable;
$item>checkout(John);
$item>checkin();
$this>assertEqual(library  $item>status);
$this>assertFalse($item>borrower);
}
}

  要實現這一最初測試的需求我們來創建一個帶有若干公共屬性和一些方法的類來觸發這些屬性的值

  class  Lendable  {
public  $status  =  library;
public  $borrower  =  ;
public  function  checkout($borrower)  {
$this>status  =  borrowed;
$this>borrower  =  $borrower;
}
public  function  checkin()  {
$this>status  =  library;
$this>borrower  =  ;
}
}

  Lendable 是一個好的普通的開端讓我們將它擴展到諸如 DVD 或 CD 的磁道項媒體擴展了 Lendable並且磁道詳細記錄了特定媒體的詳細信息包括項目的名稱發布的年份以及項本身的類型

  class  Media  extends  Lendable  {
public  $name; public  $type; public  $year;
public  function  __construct($name  $year  $type=dvd )  {
$this>name  =  $name;
$this>type  =  $type;
$this>year  =  (int)$year;
}
}

  要使事情更加簡單媒體有三個公共的實例變量Media::nameMedia::year 和Media::type構造函數采用了兩個參數將第一個存儲在 $name 中第二個存儲在 $year 中構造函數還允許可選的第三個參數來指定類型(缺省為dvd)

  給定單獨的對象來操作你現在可以創建一個容器來包含他們Library類似於常用的庫Library 應該能夠添加刪除和計算集合中的項甚至Library 還應該允許訪問集合(本章中的樣本代碼部分可看到示例)中的單一的項(對象)

  我們開始構建 Library 的測試用例

  class  LibraryTestCase  extends  UnitTestCase  {
function  TestCount()  {
$lib  =  new  Library;
$this>assertEqual(  $lib>count());
}
}

  它是滿足這一測試的簡單類

  class  Library  {
function  count()  {
return  ;
}
}

  繼續將一些有趣的功能添加到測試中

  class  LibraryTestCase  extends  UnitTestCase  {
function  TestCount()  {  /*    */  }
function  TestAdd()  {
$lib  =  new  Library;
$lib>add(one);
$this>assertEqual(  $lib>count());
}
}

  實現 add() 的簡單方法是建立在 PHP 靈活數組函數的基礎上你可以將項添加到實例變量並使用 count() 來返回集合眾項的數量

  class  Library  {
protected  $collection  =  array();
function  count()  {
return  count($this>collection);
}
function  add($item)  {
$this>collection[]  =  $item;
}
}

  Library 現在是一個集合但它沒有提供檢索或操縱單一數組成員的方法


From:http://tw.wingwit.com/Article/program/net/201311/13092.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.