最近在写代码的时候老是感觉那里不对劲,觉得整体代码还是不够完善,所以开始研究起设计模式。
一切以代码样例说话
单件模式在上次说过,具体看 http://rtxbc.iteye.com/blog/867500
策略模式
<?php /** *策略模式 *实现方式:一个抽象的拥有一个算法方法的基类;继承这个基类的具体的类来实现 *策略模式经常跟工厂模式一起使用 */ abstract class fileName{ abstract function createLinkName($filename); } class zipFileName extends fileName{ function createLinkName($filename){ return 'http://www.foo.com/'.$filename.'.zip'; } } class tarFilename extends fileName{ function createLinkName($filename){ return 'http://www.foo.com/'.$filename.'.tar'; } } // 使用 if(strstr($_SERVER['HTTP_USER_AGENT'],'Win')){ $filename = new zipFileName(); }else{ $filename = new tarFileName(); } echo $filename->createLinkName('ok');
工厂模式&&策略模式
<?php
/**
*工厂模式
*实现方式:工厂类拥有一个静态的方法(用于接收一些输入,并根据输入决定应该创建哪个类的实例-通常是一个子类)
*下面实例是策略模式和工厂模式的综合使用
*/
abstract class User{
protected $_name=NULL;
function __construct($name){
$this->_name = $name;
}
// 权限方法
abstract function hasModifyPermission();
}
class GuestUser extends User{
function hasModifyPermission(){
return false;
}
}
class adminUser extends User{
function hasModifyPermission(){
return true;
}
}
// 工厂模式
class UserFactory{
static function create($name){
switch($name){
case 'guest': return new GuestUser($name);
case 'admin': return new adminUser($name);
default:;
}
}
}
var_dump(UserFactory::create('guest')->hasModifyPermission()); // output false
var_dump(UserFactory::create('admin')->hasModifyPermission()); // output true
观察者模式(需要好好理解)
<?php
/**
*观察者模式
*实现方式:通过一个观察者observer接口来实现,对作为观察者感兴趣的类需要实现这个接口
*
* 一个对象想要"可观察",通常需要一个注册方法,这让观察这对象可以注册它自己
*
*/
interface observer{
function notify($obj);
}
class exchange{
static function getInstance(){
static $instance = NULL;
if($instance === NULL){
$instance = new self();
}
return $instance;
}
private $_observers = array();
public $_rate=1.0;
function setChange($rate){
$this->_rate = $rate;
$this->notifyObservers();
}
function registerObserver($obj){
$this->_observers[] = $obj;
}
function notifyObservers(){
foreach($this->_observers as $obj){
$obj->notify($this);
}
}
}
class product implements observer{
function __construct(){
exchange::getInstance()->registerObserver($this);
}
function notify($obj){
if($obj instanceof exchange){
echo $obj->_rate," Update!\n";
}
}
}
$p1 = new product();
$p2 = new product();
exchange::getInstance()->setChange(4.5);
/*
*分析: $p1,$p2 注册到exchange对象里,当exchange更新时,会通知(notify())$p1和$p2
*/