- 浏览: 830951 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
xieye:
jetty插件有好几个版本,1.6,1.7,1.8
我选的是用 ...
tapestry入门(翻译)3 导入项目到eclipse -
xieye:
还有,
注:第2部分时,需要先安装jetty,我自己在安装过程 ...
tapestry入门(翻译)3 导入项目到eclipse -
xieye:
说明一下:实际使用中,导入时我并没有错误。2、我把eclips ...
tapestry入门(翻译)3 导入项目到eclipse -
xieye:
其实还是有一些先决条件的。1是外部环境,2是进步是阶段性的(意 ...
(转载文章)如何愉悦起来:一位精神治疗师的见解 -
mandy_yanzi:
我都已经饿7天了坚持为了我的衣衣
身体健康的问题
我的设计模式系列文章
php设计模式(1)-- 观察者模式 -- spl标准写法
php设计模式(2)-- 观察者模式 -- 用trait来改进的写法
php设计模式(3)-- 责任链(职责链)模式
php设计模式(4)-- 装饰器模式
这次讨论责任链。
分析
实际上,责任链很想象软件开发中的中间件,请求只有一个,但是会有很多处理对象,每个处理对象都包含下一个对象,每个处理对象都有权处理。
主要角色,处理类,以及其共同接口
次要角色,请求对象。
网上的代码很多,主要是一个员工请假的需求,太无聊了。下面我构造一个需求,假设请求是用户想要修改他自己的密码,于是请求对象包含请求url,用户名,原密码,新密码。
还有一个需求,用户检查他的粉丝,不需要登录校验。
在处理过程中,我会记录所有请求的日志,这里使用一个处理类。
在处理过程中,有些请求需要校验用户密码,有些不需要,这是登录验证请求。
在处理过程中,如果请求url错误,会报告错误。
所以总共是日志处理器,登录校验处理器,密码修改处理器,查询粉丝处理器。
经验体会,该模式可以有返回值,也可以没有返回值。随意。
经验2:构造责任处理器链,是在客户端代码中,请注意这一点。
代码实现
结果展示
php设计模式(1)-- 观察者模式 -- spl标准写法
php设计模式(2)-- 观察者模式 -- 用trait来改进的写法
php设计模式(3)-- 责任链(职责链)模式
php设计模式(4)-- 装饰器模式
这次讨论责任链。
分析
实际上,责任链很想象软件开发中的中间件,请求只有一个,但是会有很多处理对象,每个处理对象都包含下一个对象,每个处理对象都有权处理。
主要角色,处理类,以及其共同接口
次要角色,请求对象。
网上的代码很多,主要是一个员工请假的需求,太无聊了。下面我构造一个需求,假设请求是用户想要修改他自己的密码,于是请求对象包含请求url,用户名,原密码,新密码。
还有一个需求,用户检查他的粉丝,不需要登录校验。
在处理过程中,我会记录所有请求的日志,这里使用一个处理类。
在处理过程中,有些请求需要校验用户密码,有些不需要,这是登录验证请求。
在处理过程中,如果请求url错误,会报告错误。
所以总共是日志处理器,登录校验处理器,密码修改处理器,查询粉丝处理器。
经验体会,该模式可以有返回值,也可以没有返回值。随意。
经验2:构造责任处理器链,是在客户端代码中,请注意这一点。
代码实现
<?php /** * 责任链的处理器 共同抽象接口 */ abstract class Handler { protected $successor; // 处理请求对象 abstract public function handleRequest($request); // 设置下个处理器。 public function setSuccessor(Handler $next_handler){ $this->successor = $next_handler; } } /** * 这是请求对象 */ class Request { public $url; public $username; public $password; public $request_parameter; public function __construct($url,$username, $password, array $request_parameter){ $this->url=$url; $this->username=$username; $this->password=$password; $this->request_parameter=$request_parameter; } } /** * 日志处理器 */ class Log extends Handler { public function handleRequest($request) { echo "url:{$request->url}; request_parameter:" . json_encode($request->request_parameter) . PHP_EOL; if ($this->successor) { // 直接把请求传递下去 return $this->successor->handleRequest($request); } return ['code'=>0]; } } /** * 身份检验处理器,应该使用数据库,这里用数组代替 */ class Verification extends Handler { protected $all_user; protected $all_url; public function __construct(){ $this->all_users = [ 'name1' =>'123', 'name2' => '456', ]; $this->check_urls = [ 'change_password', ]; } private function continue_request($request){ if ($this->successor) { // 直接把请求传递下去 return $this->successor->handleRequest($request); } } public function handleRequest($request) { if (in_array( $request->url, $this->check_urls )) { if ( array_key_exists($request->username, $this->all_users ) && $request->password == $this->all_users[$request->username] ) { return $this->continue_request($request); } else { return ['code'=>0,'message'=>'用户认证错误' ]; } }else { return $this->continue_request($request); } } } /** * 修改密码 处理器 * 修改数据库代码略。 */ class ChangePassword extends Handler { public function handleRequest($request) { if ($request->url == 'change_password') { // 这里还可以继续检查参数是否正确,代码略 return ['code'=>1,'data'=> "{$request->username}您好,密码修改成功,新密码是{$request->request_parameter['new_password']}"]; } if ($this->successor) { // 直接把请求传递下去 return $this->successor->handleRequest($request); } return ['code'=>0,'message'=>'url 不合法']; } } /** * 查粉丝,数据库代码用数组代替 */ class QueryFans extends Handler { protected $all_user; public function __construct(){ $this->all_users = [ 'name1' =>'您的粉丝是name3,name4', 'name2' => '您的粉丝是name5,name6,name7', ]; } public function handleRequest($request) { if ($request->url == 'query_fans') { if (array_key_exists( $request->username, $this->all_users )) { return ['code'=>1,'data'=> "{$request->username}您好,". $this->all_users[ $request->username ] ]; }else { return ['code'=>0,'message' =>'用户不存在' ]; } } if ($this->successor) { // 直接把请求传递下去 return $this->successor->handleRequest($request); } return ['code'=>0,'message'=>'url 不合法']; } } /** * 客户端代码,验证责任链设计模式 */ class Client { public function __construct(){ $change_pass_handler = new ChangePassword(); $query_handler = new QueryFans(); $log_handler = new Log(); $verification = new Verification(); $log_handler->setSuccessor($verification); $verification->setSuccessor($change_pass_handler); $change_pass_handler->setSuccessor($query_handler); $request = new Request('luanxie_url', '', '', []); $result = $log_handler->handleRequest($request); // 把日志作为第一个处理器 $this->print_result($result); // 故意写错密码 $request = new Request('change_password', 'name1', '1266', ['new_password'=>'124']); $result = $log_handler->handleRequest($request); $this->print_result($result); //故意写不存在 的用户 $request = new Request('change_password', 'name444', '123', ['new_password'=>'124']); $result = $log_handler->handleRequest($request); $this->print_result($result); // 这次是符合规范的。 $request = new Request('change_password', 'name1', '123', ['new_password'=>'124']); $result = $log_handler->handleRequest($request); $this->print_result($result); //粉丝查询,业务逻辑规定:不需要校验密码,写错也无所谓 $request = new Request('query_fans', 'name1', '12789', []); $result = $log_handler->handleRequest($request); $this->print_result($result); } private function print_result($result) { if ($result['code']==1) { echo $result['data']; }else { echo $result['message']; } echo PHP_EOL.PHP_EOL; } } new Client();
结果展示
url:luanxie_url; request_parameter:[] url 不合法 url:change_password; request_parameter:{"new_password":"124"} 用户认证错误 url:change_password; request_parameter:{"new_password":"124"} 用户认证错误 url:change_password; request_parameter:{"new_password":"124"} name1您好,密码修改成功,新密码是124 url:query_fans; request_parameter:[] name1您好,您的粉丝是name3,name4
发表评论
-
召唤神龙 - 安装 centos 8, php 8, mysql 8, laravel 8 的整套 php 运行环境
2020-11-27 16:26 674本文编写时间:2020-11-27 传说集齐龙珠可以召唤神 ... -
centos8 使用阿里镜像快速安装php7.4套件
2020-11-15 00:48 809centos8 使用阿里镜像快速安装php7.4套件 本文只 ... -
centos7 使用阿里镜像快速安装php7.4套件
2020-11-15 00:32 1218本文只考虑centos7 今日 2020-11-16 rem ... -
composer常用命令
2020-11-05 14:46 1441列出当前全局配置 composer config -l -g ... -
期待centos8+php8 + mysql8 + laravel8,8888
2020-10-29 19:24 486期待centos8+php8 + mysql8 目前主要使用 ... -
ubuntu 安装 php7.4以及各类插件
2020-10-24 13:20 1089ubuntu 安装 php7.4以及各类插件 安装系统 最近 ... -
宝塔定义站点
2020-02-24 10:41 2宝塔定义站点。 1111111111111111111111 ... -
让php-fpm以root账号运行
2020-02-19 21:41 810一般来说,我们没有这种需求,但是当需要时, 可以让php-fp ... -
将代码部署到coding.net
2020-01-10 14:20 632coding.net 是一个git仓库,有免费有收费。 首先 ... -
php部署工具deployer技巧 - vendor目录创建
2020-01-06 12:06 889deployer是个好东西,可是每次都composer ,其实 ... -
自定义redis多个实例
2020-01-04 01:17 645假如多个项目部署到同一台服务器,有时会被redis的各项目前缀 ... -
推荐使用php的部署工具 deployer
2020-01-03 16:48 881php部署代码可以使用 https://deployer.or ... -
使用composer 类库 cachetool 清除opcache 的缓存
2020-01-03 16:38 962php的生产服务器上,需要把opche打开。 但有时,会被缓 ... -
laravel容器学习体会
2019-12-31 15:11 654根据文档与实测结果 假设我在app下建一个Services目 ... -
phalcon 自定义超强日志类
2019-12-18 10:00 826phalcon自带的日志文件类,有两个麻烦之处。 1、路径不能 ... -
自定义后台的使用
2019-12-18 05:22 423如果自己写后台,保存用户的表单请求值 所有的情况如下: 1 ... -
phalcon 自定义事件使用的多种方式
2019-12-16 20:43 778方法1:官方文档的方式。 这是控制器: public ... -
phalcon对控制器返回值的使用以输出json
2019-12-16 19:17 817在phalcon里,控制器的Action的方法的返回值没啥用。 ... -
phalcon数据库DB使用实例
2019-12-12 17:12 695整理了一下phalcon的db使用,写了个demo。 ... -
php-redis5.0降级成php-redis4.3
2019-08-22 00:01 889最新版本的php的redis插件,版本是5.0 但是可能会有 ...
相关推荐
- 责任链模式(Chain of Responsibility):避免将处理请求的发送者和接收者耦合在一起,让多个对象都有可能处理请求。 - 命令模式(Command):将一个请求封装为一个对象,以便使用不同的请求、队列或者日志请求...
7. 结构型模式如代理模式、桥接模式、组合模式等,以及行为型模式如策略模式、职责链模式、命令模式等,都是PHP开发中常见的设计模式,它们各自解决特定的软件设计问题,提高了代码的灵活性和可维护性。 通过学习和...
1. **责任链模式(Chain of Responsibility)**:将请求沿着处理者链传递,直到有处理者处理请求。 2. **命令模式(Command)**:将请求封装为一个对象,以便使用不同的请求、队列请求或日志请求。 3. **解释器模式...
职责链模式避免将请求的发送者和接收者耦合在一起,让多个对象都有可能处理请求。在PHP中,它常用于处理不同级别的错误或异常,每个处理器可以决定是否处理请求,或者将请求传递给下一个处理器。 11. **命令模式...
3. 行为型模式:包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、访问者模式(Visitor)、命令模式(Command)、备忘录模式(Memento)、状态模式...
* @desc php设计模式之职责链模式(责任链模式) 定义:顾名思义,责任链模式为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。 在...
"PHP设计模式的使用"这个主题涵盖了如何在PHP项目中有效地应用这些模式,以提升代码的可读性、可维护性和可扩展性。 设计模式分为三大类:创建型模式、结构型模式和行为型模式。每种模式都有其特定的目的和应用场景...
3. 行为型模式:如策略(Strategy)、模板方法(Template Method)、观察者(Observer)、责任链(Chain of Responsibility)、访问者(Visitor)、命令(Command)、迭代器(Iterator)、备忘录(Memento)、状态...
《Learning PHP设计模式》这本书是面向PHP开发者的一本专业指南,旨在帮助读者深入理解并掌握设计模式在PHP编程中的应用。设计模式是软件工程中经过时间验证的最佳实践,它们为解决常见问题提供了一种标准的方法,使...
- 责任链模式:避免将请求的发送者和接收者耦合在一起,使得多个对象都有可能处理请求。 - 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求、或者记录请求日志。 - 解释器模式:给定一种语言,...
10. **职责链设计模式**:将请求沿着接收者链进行传递,直到某个对象决定处理它。 11. **命令设计模式**:将请求封装为一个对象,以便使用不同的请求、队列请求,或者支持可撤销的操作。 12. **组合设计模式**:...
12. **责任链模式(Chain of Responsibility)**:避免将处理逻辑耦合在单一对象中,形成一个处理请求的链。 13. **命令模式(Command)**:将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持可撤销的...
3. 行为型模式:这类模式关注对象之间的交互和职责分配,包括责任链(Chain of Responsibility)、命令(Command)、解释器(Interpreter)、迭代器(Iterator)、备忘录(Memento)、观察者(Observer)、状态...
通过学习如何在代码中使用设计模式,可以更高效...第5部分 MySQL和PHP设计模式 第11章 通用类负责连接,代理模式保证安全 第12章 策略设计模式的灵活性 第13章 职责链设计模式 第14章 利用观察者模式构建多设备CMS
- **责任链模式(Chain of Responsibility)**:避免将处理请求的发送者和接收者耦合在一起,让多个对象都有可能处理请求。 - **命令模式(Command)**:将请求封装为一个对象,以便使用不同的请求、队列请求或...
- **责任链模式**:让多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。 - **迭代器模式**:提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。 - **备忘录模式**:在不破坏封装性...
- 责任链模式:避免将请求的发送者与接收者耦合在一起,多个对象可以处理同一个请求。 - 命令模式:将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。 - 解释器模式:给定一种语言,定义其文法的...
13. **职责链模式**:将请求沿着处理者链进行传递,直到有处理者处理该请求。 14. **命令模式**:将请求封装为一个对象,从而可以使用不同的请求、队列请求、或者记录请求日志。 15. **解释器模式**:给定一个语言...
责任链模式(Chain of Responsibility)是一种行为设计模式,它的核心思想是将多个处理请求的对象链接成一条链,每个对象称为处理者(Handler),当请求到来时,沿着链传递,直到有对象能处理这个请求。这种模式可以...