设计模式二

    最近在写代码的时候老是感觉那里不对劲,觉得整体代码还是不够完善,所以开始研究起设计模式。

一切以代码样例说话

 

单件模式在上次说过,具体看 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
 */

 

 

 

 

 

 

 

 

你可能感兴趣的:(设计模式,PHP,算法,Blog,Exchange)