php設計模式

一、簡單工廠模式

簡單工廠模式又被稱爲靜態工廠模式,具體指創建一個類似於工廠的類,通過類中成員方法的調用返回不同類型的對象,通過對該類中成員方法的調用返回不同類型的對象。

在面向對象編程方式中,簡單工廠模式是一種經常使用到的模式。提供了一種在實時狀態下實例化對象的機制。

e.g

<?php
abstract class Product//抽象類
{
     abstract function getName();//抽象方法
}

class ProductA extends Product//具體產品類
{
     public function getName()
     {
            echo "i am productA";
     }
}
class ProductB extends Product//具體產品類
{
     public function getName()
     {
            echo "i am productB";
     }
}

class ProductFactory//工廠類
{
     static function create($name)
     {
          switch($name)
          {
                case "A":
                      return new ProductA();
                case "B":
                      return new ProductB();
          }
     }
}

$product = ProductFactory::create("A");
$product->getName();
$product = ProductFactory::create("B");
$product->getName();

二、單元素模式

單元素模式指的是在應用程序範圍內只對指定的類創建一個實例。單元素模式包含的對象只有一個,就是單元素本身。

單元素模式能夠確保某個類只生成一個實例對象,通常該模式中包含一個私有構造方法,用來確保用戶無法通過克隆的方式對其進行實例化。此外還包含一個私有靜態屬性與公有靜態方法。

公有靜態方法負責對其本身實例化,然後將這個對象存儲在私有靜態屬性中,用來確保只有一個實例被創建。

e.g

<?php
class Singleton
{
    private static $instance = null;
    pricate function __construct(){}
    public static function getInstance()
    {
          if(self::$instance==null)
          {
                return new Singleton();
          }
          retrun self::$instance;
    }
    public function printString()
    {
         echo  "hellword";
    }
}
$class = Singleton::getInstance();
$class->printString();
其中私有構造方法,用來確保Singleton類無法通過創建對象或者克隆的方式對進行實例化

三、觀察者模式

觀察者模式必須包含兩個角色,觀察者和被觀察對象。

觀察者模式的實現通常是一個對象通過添加一個方法使本身變得可觀察。

e.g

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)
             {
                $obj->onChanged($this,$name);
              }
      }
      public function addObserver($observer)
{
    $this->_observers[] = $observer;
}
}

class UserListLogger implements IObserver
{
      public function onChanged($sender,$args)
     {
          echo "$args被添加到用戶列表中";
     }
}
$ul = new UserList();
$ul->addObserver(new UserListLogger());
$ul->addCustomer('cz');
四、命令模式
命令模式用來分離請求操作的客戶端和執行該操作的那個對象。通過將請求本身變成一個對象來使行爲請求者可向未指定的應用對象提出請求。

e.g

<?php
interface ICommand//命令處理接口
{
	function onCommand($name,$args);
}

class CommandChain
{
	private $_commands = array();
	
	public function addCommand($cmd)//添加命令處理
	{
		$this->_commands[] = $cmd;
	}
	
	public function runCommand($name,$args)//執行命令
	{
		foeach($this->_commands as $cmd)
		{
			if($cmd->onCommand($name,$args))
			{
				return;//命令執行成功退出
			}
		}
	}
}

class UserCommand implements ICommand//用戶命令處理類
{
	public function onCommand($names,$args)
	{
		if($name != '用戶')
		{
			return false;
		}
		else
		{
			echo "用戶命令處理:".$names;
			return false;
		}
	}
	
}

class MailCommand implements ICommand//郵件命令處理類
{
	public function onCommand($names,$args)
	{
		if($name != '郵件')
		{
			return false;
		}
		else
		{
			echo '郵件命令處理'.$names;
			return false;
		}
	}
}

$c = new CommandChain();
$c->addCommand(new UserCommand());
$c->addCommand(new MailCommand());
$c->runCommand('用戶',null);
$c->runCommand('郵件',null);
?>

五、策略模式

指的是在程序中涉及決策控制的一種模式。策略模式定義一組算法,將每個算法都封裝起來,並且使他們之間可以互換。策略模式使這些算法在客戶端調用它他們的時候能互不影響的變化。

策略模式通常定義一個抽象的基類,然後根據情況的不同創建不同的類繼承這個基類。

<?php
interface IStrategy
{
	public function OnTheWay(); 
}
class WalkStrategy implements IStrategy
{
	public function OnTheWay()
	{
		echo "一個人在路上走";
	}
}
class RideBickStrategy implements IStrategy
{
	public function OnTheWay()
	{
		echo "一個人騎自行車在路上";
	}
}

class Context
{
	public function find($stategy)
	{
		$stategy->OnTheWay();
	}
}
$c = new Context();
$c->find(new WalkStrategy());
$c->find(new RideBickStrategy());
?>

五、MVC模式

你懂的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章