原文链接:
解释:
通过分配或委托至其他对象,委托设计模式能够去除核心对象中的判决和复杂的功能性。(就是能够减少is else语句)
需求:
对于一个用户集合UserList:
namespace Delegate;class UserList { private $users = []; public function addUser($user) { $this->users[] = $user; } public function outXml() { // 不严谨,这里仅作实例 echo ''; foreach ($this->users as $user) { echo ' '; } public function outJson() { echo json_encode($this->users); }}' . $user .' '; } echo '
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 ''; foreach ($users as $user) { echo ' '; }}' . $user .' '; } echo '
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对象(这里没写这个类)。