委托模式
原文链接: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对象(这里没写这个类)。