微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

委托模式

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐