委托模式

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

posted @ 2016-04-03 21:57  orlion  阅读(250)  评论(0编辑  收藏  举报