原文链接:http://www.orlion.ga/741/
解释:
通过分配或委托至其他对象,委托设计模式能够去除核心对象中的判决和复杂的功能性。(就是能够减少is else语句)
需求:
对于一个用户集合UserList:
namespace Delegate;
class UserList {
private $users = [];
public function addUser($user) {
$this->users[] = $user;
}
public function outXml() {
// 不严谨,这里仅作实例
echo '<xml>';
foreach ($this->users as $user) {
echo '<user>' . $user .'</user>';
}
echo '</xml>';
}
public function outJson() {
echo json_encode($this->users);
}
}
UserList管理着许多用户,其中outXml()方法将这些用户以xml方式输出,outJson()以json格式输出。
在App.php中调用:
require 'UserList.php';
$ul = new Delegate\UserList();
$ul->addUser('a');
$ul->addUser('b');
$ul->addUser('c');
$type = 'xml';
if ('xml' === $type) {
$ul->outXml();
} else if ('json' === $type) {
$ul->outJson();
}
可以看到我们使用了一个if else语句做了一个判断userlist的输出方式。
代码:
首先修改一下UserList类为NewUserList:
namespace Delegate;
class NewUserList {
private $users = [];
private $_typeObj;
public function __construct(UserListDelegate $typeObj) {
$this->_typeObj = $typeObj;
}
public function addUser($user) {
$this->users[] = $user;
}
public function outUserList() {
$this->_typeObj->outUserList($this->users);
}
}
利用委托模式,创建一个委托类接口:
namespace Delegate;
interface UserListDelegate {
public function outUserList(Array $users);
}
然后实现这个委托类接口:
namespace Delegate;
class XmlUserListDelegate implements UserListDelegate {
public function outUserList(Array $users) {
echo '<xml>';
foreach ($users as $user) {
echo '<user>' . $user .'</user>';
}
echo '</xml>';
}
}
App.php:
require 'UserListDelegate.php';
require 'XmlUserListDelegate.php';
require 'NewUserList.php';
$xmlUlDelegate = new Delegate\XmlUserListDelegate();
$ul = new Delegate\NewUserList($xmlUlDelegate);
$ul->addUser('a');
$ul->addUser('b');
$ul->addUser('c');
$ul->outUserList();
如果以Json方式输出则在构建UserList的时候传入一个JsonUserListDelegate对象(这里没写这个类)。