PHP设计模式之委托模式

通过分配或委托至其他对象,委托设计模式能够去除核心对象中的判断和复杂的功能性。
大多数 PHP 编程人员最初接触的都是过程化的编程类型。这种编程极大地依赖条件判断为基础的控制结构。面向对象的编程提供了某些不同于传统语句的手段,从而创建了多态的代码流。

以压缩包下载程序为例

压缩包下载程序第一版:条件判断跳转

demo1.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
header('Content-Type:text/html; charset=utf-8');

class CompressList{
private $file;

public function __construct(){
$this->file = [];
}

public function addCompress($path, $title, $type){
$file = ['path'=>$path, 'title'=>$title, 'type'=>$type];
$this->file[] = $file;
}

public function run(){
$info = '';
foreach($this->file as $file){
switch($file['type']){
case 'zip':
$info .= $this->getZip($file);
break;
case 'gz':
$info .= $this->getGz($file);
break;
}
}
return $info;
}

public function getZip($file){
return $file['title'].$file['path'].'[zip].<br />';
}

public function getGz($file){
return $file['title'].$file['path'].'[gz].<br />';
}
}

$compresslist = new CompressList();
$compresslist->addCompress('/web/list/123.zip', '小游戏一款', 'zip');
$compresslist->addCompress('/web/list/123.zip', '小游戏一款', 'zip');
$compresslist->addCompress('/web/list/123.zip', '小游戏一款', 'zip');
$compresslist->addCompress('/web/music', '音乐专辑一套', 'gz');
$compresslist->addCompress('/web/music', '音乐专辑一套', 'gz');
$compresslist->addCompress('/web/music', '音乐专辑一套', 'gz');
echo $compresslist->run();

压缩包下载程序第二版:使用委托实现多态

demo2.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
header('Content-Type:text/html; charset=utf-8');

class CompressList{
private $file;
private $typeObj;

public function __construct(){
$this->file = [];
}

public function addCompress($path, $title, $type){
$file = ['path'=>$path, 'title'=>$title, 'type'=>$type];
$this->file[] = $file;
}

public function run(){
$info = '';
foreach($this->file as $file){
$this->typeObj = new $file['type'];
$info .= $this->typeObj->get($file);
}
return $info;
}
}

class Zip{
public function get($file){
return $file['title'].$file['path'].'[zip].<br />';
}
}

class Gz{
public function get($file){
return $file['title'].$file['path'].'[gz].<br />';
}
}

$compresslist = new CompressList();
$compresslist->addCompress('/web/list/123.zip', '小游戏一款', 'zip');
$compresslist->addCompress('/web/list/123.zip', '小游戏一款', 'zip');
$compresslist->addCompress('/web/list/123.zip', '小游戏一款', 'zip');
$compresslist->addCompress('/web/music', '音乐专辑一套', 'gz');
$compresslist->addCompress('/web/music', '音乐专辑一套', 'gz');
$compresslist->addCompress('/web/music', '音乐专辑一套', 'gz');
echo $compresslist->run();

此版本使用了委托模式,把 CompressList 里需要条件判断的地方进行了去除,把复杂功能性进行了分离,实现了维护和扩展性的便利。