兩個簡單的php設計模式(php設計模式及使用場景)

本文目錄一覽:

php中有哪些設計模式,舉例說明應用場景

PHP 一般有五種常見的設計模式

工廠模式

它具有創建對象的某些方法。可以使用工廠類創建對象,而不直接使用 new。

例如:

?php

interface IUser

{

function getName();

}

class User implements IUser

{

public function __construct( $id ) { }

public function getName()

{

return “Jack”;

}

}

class UserFactory

{

public static function Create( $id )

{

return new User( $id );

}

}

$uo = UserFactory::Create( 1 );

echo( $uo-getName().”\n” );

?

另外四種是:觀察者模式,單元素模式,命令鏈模式,策略模式。例子可以百度一搜。

php中常見的幾種設計模式

狀態state模式是GOF23種模式中的一種,和命令模式一樣,也是一種行為模式。狀態模式和命令模式相當像,一樣是「介面—實現類」這種模式的應用,是面向介面編程原則的體現。

狀態模式屬於對象創建型模式,其意圖是允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了他的類。比較常見的例子是在一個表示網路連接的類TCPConnection,一個TCPConnection對象的狀態處於若干不同的狀態之一:連接已經建立(Established),正在監聽,連接已經關閉(closed)。當一個TCPConnection對象收到其他對象的請求時,他根據自身的狀態作出不同的反應。

PHP有哪幾種設計模式?

PHP 一般有五種常見的設計模式

工廠模式

工廠模式 是一種類,它具有為您創建對象的某些方法。您可以使用工廠類創建對象,而不直接使用 new。這樣,如果您想要更改所創建的對象類型,只需更改該工廠即可。使用該工廠的所有代碼會自動更改。

例如:

?php

interface IUser

{

function getName();

}

class User implements IUser

{

public function __construct( $id ) { }

public function getName()

{

return “Jack”;

}

}

class UserFactory

{

public static function Create( $id )

{

return new User( $id );

}

}

$uo = UserFactory::Create( 1 );

echo( $uo-getName().”\n” );

?

單元素模式

某些應用程序資源是獨佔的,因為有且只有一個此類型的資源。例如,通過資料庫句柄到資料庫的連接是獨佔的。您希望在應用程序中共享資料庫句柄,因為在保持連接打開或關閉時,它是一種開銷,在獲取單個頁面的過程中更是如此。

單元素模式可以滿足此要求。如果應用程序每次包含且僅包含一個對象,那麼這個對象就是一個單元素(Singleton)。

例如:

?php

require_once(“DB.php”);

class DatabaseConnection

{

public static function get()

{

static $db = null;

if ( $db == null )

$db = new DatabaseConnection();

return $db;

}

private $_handle = null;

private function __construct()

{

$dsn = ‘mysql://root:password@localhost/photos’;

$this-_handle = DB::Connect( $dsn, array() );

}

public function handle()

{

return $this-_handle;

}

}

print( “Handle = “.DatabaseConnection::get()-handle().”\n” );

print( “Handle = “.DatabaseConnection::get()-handle().”\n” );

?

觀察者模式

觀察者模式為您提供了避免組件之間緊密耦合的另一種方法。該模式非常簡單:一個對象通過添加一個方法(該方法允許另一個對象,即觀察者 註冊自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發送到已註冊的觀察者。這些觀察者使用該信息執行的操作與可觀察的對象無關。結果是對象可以相互對話,而不必了解原因。

例如:

?php

interface IObserver

{

function onChanged( $sender, $args );

}

interface IObservable

{

function addObserver( $observer );

}

class UserList implements IObservable

{

private $_observers = array();

public function addCustomer( $name )

{

foreach( $this-_observers as $obs )

$obs-onChanged( $this, $name );

}

public function addObserver( $observer )

{

$this-_observers []= $observer;

}

}

class UserListLogger implements IObserver

{

public function onChanged( $sender, $args )

{

echo( “‘$args’ added to user list\n” );

}

}

$ul = new UserList();

$ul-addObserver( new UserListLogger() );

$ul-addCustomer( “Jack” );

?

命令鏈模式

命令鏈 模式以鬆散耦合主題為基礎,發送消息、命令和請求,或通過一組處理程序發送任意內容。每個處理程序都會自行判斷自己能否處理請求。如果可以,該請求被處理,進程停止。您可以為系統添加或移除處理程序,而不影響其他處理程序。

例如:

?php

interface ICommand

{

function onCommand( $name, $args );

}

class CommandChain

{

private $_commands = array();

public function addCommand( $cmd )

{

$this-_commands []= $cmd;

}

public function runCommand( $name, $args )

{

foreach( $this-_commands as $cmd )

{

if ( $cmd-onCommand( $name, $args ) )

return;

}

}

}

class UserCommand implements ICommand

{

public function onCommand( $name, $args )

{

if ( $name != ‘addUser’ ) return false;

echo( “UserCommand handling ‘addUser’\n” );

return true;

}

}

class MailCommand implements ICommand

{

public function onCommand( $name, $args )

{

if ( $name != ‘mail’ ) return false;

echo( “MailCommand handling ‘mail’\n” );

return true;

}

}

$cc = new CommandChain();

$cc-addCommand( new UserCommand() );

$cc-addCommand( new MailCommand() );

$cc-runCommand( ‘addUser’, null );

$cc-runCommand( ‘mail’, null );

?

策略模式

我們講述的最後一個設計模式是策略 模式。在此模式中,演算法是從複雜類提取的,因而可以方便地替換。例如,如果要更改搜索引擎中排列頁的方法,則策略模式是一個不錯的選擇。思考一下搜索引擎的幾個部分 —— 一部分遍歷頁面,一部分對每頁排列,另一部分基於排列的結果排序。在複雜的示例中,這些部分都在同一個類中。通過使用策略模式,您可將排列部分放入另一個類中,以便更改頁排列的方式,而不影響搜索引擎的其餘代碼。

例如:

?php

interface IStrategy

{

function filter( $record );

}

class FindAfterStrategy implements IStrategy

{

private $_name;

public function __construct( $name )

{

$this-_name = $name;

}

public function filter( $record )

{

return strcmp( $this-_name, $record ) = 0;

}

}

class RandomStrategy implements IStrategy

{

public function filter( $record )

{

return rand( 0, 1 ) = 0.5;

}

}

class UserList

{

private $_list = array();

public function __construct( $names )

{

if ( $names != null )

{

foreach( $names as $name )

{

$this-_list []= $name;

}

}

}

public function add( $name )

{

$this-_list []= $name;

}

public function find( $filter )

{

$recs = array();

foreach( $this-_list as $user )

{

if ( $filter-filter( $user ) )

$recs []= $user;

}

return $recs;

}

}

$ul = new UserList( array( “Andy”, “Jack”, “Lori”, “Megan” ) );

$f1 = $ul-find( new FindAfterStrategy( “J” ) );

print_r( $f1 );

$f2 = $ul-find( new RandomStrategy() );

print_r( $f2 );

?

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/152089.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-12 00:55
下一篇 2024-11-12 00:55

相關推薦

  • 利用Python實現兩個鏈表合併為一個有序鏈表

    對於開發工程師來說,實現兩個鏈表合併為一個有序鏈表是必須掌握的技能之一。Python語言在鏈表處理上非常便利,本文將從多個方面詳細闡述如何利用Python實現兩個鏈表合併為一個有序…

    編程 2025-04-29
  • Unity3D 創建沒有 Terrain Tile 的場景

    這篇文章將會介紹如何在 Unity3D 中創建一個沒有 Terrain Tile 的場景,同時也讓讀者了解如何通過編程實現這個功能。 一、基礎概念 在 Unity3D 中,Terr…

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python定義兩個列表的多面探索

    Python是一種強大的編程語言,開放源代碼,易於學習和使用。通過Python語言,我們可以定義各種數據類型,如列表(list)。在Python中,列表(list)在處理數據方面起…

    編程 2025-04-29
  • Python強制轉型的實現方法和應用場景

    本文主要介紹Python強制轉型的實現方法和應用場景。Python強制轉型,也叫類型轉換,是指將一種數據類型轉換為另一種數據類型。在Python中,強制轉型主要通過類型構造函數、轉…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python兩個線程交替列印1到100

    這篇文章的主題是關於Python多線程的應用。我們將會通過實際的代碼,學習如何使用Python兩個線程交替列印1到100。 一、創建線程 在Python中,我們可以使用Thread…

    編程 2025-04-28
  • leveldb和unqlite:兩個高性能的資料庫存儲引擎

    本文將介紹兩款高性能的資料庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28

發表回復

登錄後才能評論