委托模式
发布时间:2020-12-14 04:46:31 所属栏目:百科 来源:网络整理
导读:原文链接:http://www.orlion.ga/741/ 解释: ????通过分配或委托至其他对象,委托设计模式能够去除核心对象中的判决和复杂的功能性。(就是能够减少is else语句) 需求: ????对于一个用户集合UserList: namespace?Delegate;class?UserList?{private?$users?=
原文链接: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?DelegateUserList(); $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?DelegateXmlUserListDelegate(); $ul?=?new?DelegateNewUserList($xmlUlDelegate); $ul->addUser('a'); $ul->addUser('b'); $ul->addUser('c'); $ul->outUserList(); ????如果以Json方式输出则在构建UserList的时候传入一个JsonUserListDelegate对象(这里没写这个类)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |