• 委托模式


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

  • 相关阅读:
    django+uwsgi+nginx实现负载均衡
    centos7 pip安装
    centos虚拟环境配置
    cenots7更换国内pip源
    FastDFS缩容
    FastDFS基于group扩容
    centos同步系统时间
    centos永久开放端口
    pip更换国内源
    Java四种访问修饰符
  • 原文地址:https://www.cnblogs.com/orlion/p/5350917.html
Copyright © 2020-2023  润新知