初稿链接: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);
    }
}

   

  json  利用委托模式,创建一个委托类接口:

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对象(这里没写这个看似)。

相关文章

网站地图xml地图