职责链

叙述

示例

<?php
/**
* 职责链的组织可写在配置文件里
* 每个职责类可对同一个请求选择性的处理,之后可交由下一个类处理,也可终止
* 抽象出职责类 Handler,每个具体的职责类处理各自的事情
*/
abstract class Handler {
    protected $_handlerName = null;
    protected $_nextHandler = null;

    public function __construct($handleName) {
        $this->_handlerName = $handleName;
    }

    public function setNextHandler(Handler $hander) {
        $this->_nextHandler = $hander;
    }

    public function handerRequest(Request $request) {
        echo $this->_handlerName." handerRequest\n";
        if($this->doRequest($request) === false && $this->_nextHandler) {
            return $this->_nextHandler->handerRequest($request);
        }
        return true;
    }

    /**
    * return: true/终止处理,false/由后面的职责对象继续处理
    */
    abstract public function doRequest(Request $request);
}

class Leader extends Handler {

    public function doRequest(Request $request) {
        if($request->day <= 0.5) {
            echo "\t".__METHOD__." do it\n";
            return true;
        }
        echo "\t".__METHOD__." kown it\n";
        return false;
    }
}

class Manager extends Handler {

    public function doRequest(Request $request) {
        if($request->day <= 3 && $request->day > 0.5) {
            echo "\t".__METHOD__." do it\n";
            return true;
        }
        echo "\t".__METHOD__." kown it\n";
        return false;
    }
}

class GeneralManager extends Handler {

    public function doRequest(Request $request) {
        if($request->day > 3) {
            echo "\t".__METHOD__." do it\n";
            return true;
        }
        echo "\t".__METHOD__." kown it\n";
        return false;
    }
}

class Request {
    private $_day;
    private $_name;
    private $_reason;

    public function __construct($name, $day, $reason) {
        $this->_name = $name;
        $this->_day = $day;
        $this->_reason = $this->$reason;
    }

    public function __set($name, $value) {
        $item = '_'.$name;
        $this->$item = $value;
    }

    public function __get($name) {
        $item = '_'.$name;
        if(property_exists($this, $item)) {
            return $this->$item;
        }
        return null;
    }
}

class Client {
    public static function main() {

        $leader = new Leader('leader');
        $manager = new Manager('manager');
        $generalManager = new GeneralManager('generalManager');

        $leader->setNextHandler($manager);
        $manager->setNextHandler($generalManager);

        echo "-----1-------\n";
        $leader->handerRequest(new Request('lijie', 0.5, '打牌'));
        echo "-----2-------\n";
        $leader->handerRequest(new Request('lijie', 3, '打牌'));
        echo "-----3-------\n";
        $leader->handerRequest(new Request('lijie', 5, '打牌'));
    }
}

Client::main();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值