龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php 代码均来源于《PHP设计模式》一书

时间:2015-04-01 15:48来源:网络整理 作者:网络 点击:
分享到:
代码均来源于《PHP设计模式》一书 代码均来源于《PHP设计模式》一书**Decorator.class.phpamp;nbsp;~amp;nbsp;2KBamp;nbsp;amp;nbsp;amp;nbsp;amp;nbsp;下载(35)**[代码片段(72行)]**Delegate.class.phpamp;nbsp;~amp;nbsp

代码均来源于《PHP设计模式》一书

Decorator.class.php ~ 2KB    下载(35)

<?php
/**
 * 转自 《PHP设计模式》 第六章: 装饰器模式
 *
 * 装饰器设计模式适用于下列工作场合: 需求变化是快速和细小的,而且几乎不影响应用程序的其他部分。()
 * 使用装饰器设计模式设计类的目标是: 不必重写任何已有的功能性代码,而是对某个基于对象应用增量变化。
 * 装饰器设计模式采用这样的构建方式: 在主代码流中应该能够直接插入一个或多个更改或“装饰”目标对象的装饰器,同时不影响其他代码流。
 *
 */
class CD {
    public $trackList;

    public function __construct() {
        $this->trackList = array();
    }

    public function addTrack($track) {
        $this->trackList[] = $track;
    }

    public function getTrackList() {
        $output = '';

        foreach ($this->trackList as $num => $track) {
            $output .= ($num + 1) . ") {$track}.";
        }

        return $output;
    }
}

$tracksFroExternalSource = array("What It Means", "Brr", "Goodbye");

$myCD = new CD();
foreach ($tracksFroExternalSource as $track) {
    $myCD->addTrack($track);
}

print "The CD contains:{$myCD->getTrackList()}\n";

/**
 * 需求发生小变化: 要求每个输出的参数都采用大写形式. 对于这么小的变化而言, 最佳的做法并非修改基类或创建父 - 子关系, 
                   而是创建一个基于装饰器设计模式的对象。 
 *
 */
class CDTrackListDecoratorCaps {
    private $_cd;

    public function __construct(CD $cd) {
        $this->_cd = $cd;
    }

    public function makeCaps() {
        foreach ($this->_cd->trackList as & $track) {
            $track = strtoupper($track);
        }
    }
}

$myCD = new CD();
foreach ($tracksFroExternalSource as $track) {
    $myCD->addTrack($track);
}

//新增以下代码实现输出参数采用大写形式
$myCDCaps = new CDTrackListDecoratorCaps($myCD);
$myCDCaps->makeCaps();

print "The CD contains:{$myCD->getTrackList()}\n";

/* End of Decorator.class.php */
/* Location the file Design/Decorator.class.php */

Delegate.class.php&nbsp;~&nbsp;3KB&nbsp;&nbsp;&nbsp;&nbsp;下载(25)

<?php
/**
 * 转自 《PHP设计模式》 第七章: 委托模式
 * 当一个对象包含复杂单独立的,必须基于判决执行的功能性的若干部分时,最佳的方法是适用基于委托设计模式的对象。 
 *
 */

/**
 * 示例: Web站点具有创建MP3文件播放列表的功能, 也具有选择以 M3U 或 PLS 格式下载播放列表的功能。
 *
 * 以下代码示例展示常规与委托两种模式实现
 *
 */
//常规实现 
class Playlist {

    private $_songs; 

    public function __construct() {
        $this->_songs = array();
    }

    public function addSong($location, $title) {
        $song = array("location" => $location, "title" => $title);
        $this->_songs[] = $song;
    }

    public function getM3U() {
        $m3u = "#EXTM3U\n\n";

        foreach ($this->_songs as $song) {
            $m3u .= "#EXTINF: -1, {$song['title']}\n";
            $m3u .= "{$song['location']}\n";
        }

        return $m3u;
    }

    public function getPLS() {
        $pls = "[playlist]]\nNumberOfEntries = ". count($this->_songs) . "\n\n";

        foreach ($this->_songs as $songCount => $song) {
            $counter = $songCount + 1;
            $pls .= "File{$counter} = {$song['location']}\n";
            $pls .= "Title{$counter} = {$song['title']}\n";
            $pls .= "LengthP{$counter} = -1 \n\n";
        }

        return $pls;
    }
}

$playlist = new Playlist();

$playlist->addSong("/home/aaron/music/brr.mp3", "Brr");
$playlist->addSong("/home/aaron/music/goodbye.mp3", "Goodbye");

$externalRetrievedType = "pls";

if ($externalRetrievedType == "pls") {
    $playlistContent =  $playlist->getPLS();
} else {
    $playlistContent =  $playlist->getM3U();
}

echo $playlistContent;

//委托模式实现 
class newPlaylist {

    private $_songs;
    private $_tyepObject;

    public function __construct($type) {
        $this->_songs = array();
        $object = "{$type}Playlist";
        $this->_tyepObject = new $object;
    }   

    public function addSong($location, $title) {
        $song = array("location" => $location, "title" => $title);
        $this->_songs[] = $song;
    }

    public function getPlaylist() {
        $playlist = $this->_tyepObject->getPlaylist($this->_songs);
        return $playlist;
    }
}

class m3uPlaylist {
    public function getPlaylist($songs) {
        $m3u = "#EXTM3U\n\n";

        foreach ($songs as $song) {
            $m3u .= "#EXTINF: -1, {$song['title']}\n";
            $m3u .= "{$song['location']}\n";
        }

        return $m3u;
    }   
}

class plsPlaylist {
    public function getPlaylist($songs) {
        $pls = "[playlist]]\nNumberOfEntries = ". count($songs) . "\n\n";

        foreach ($songs as $songCount => $song) {
            $counter = $songCount + 1;
            $pls .= "File{$counter} = {$song['location']}\n";
            $pls .= "Title{$counter} = {$song['title']}\n";
            $pls .= "LengthP{$counter} = -1 \n\n";
        }

        return $pls;
    }
}

$externalRetrievedType = "pls";
$playlist = new newPlaylist($externalRetrievedType);

$playlist->addSong("/home/aaron/music/brr.mp3", "Brr");
$playlist->addSong("/home/aaron/music/goodbye.mp3", "Goodbye");

$playlistContent = $playlist->getPlaylist();

echo $playlistContent;

/* End of Delegate.class.php */
/* Location the file Design/Delegate.class.php */
精彩图集

赞助商链接