PHP设计模式——职责链模式_PHP教程
PHP设计模式——职责链模式
职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法。
UML类图:
角色:
抽象处理者(Manager):定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(CommonManager):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
核心代码:
<!--?php /** * Created by PhpStorm. * User: Jang * Date: 2015/6/11 * Time: 10:16 */ //申请Model class Request { //数量 public $num; //申请类型 public $requestType; //申请内容 public $requestContent; } //抽象管理者 abstract class Manager { protected $name; //管理者上级 protected $manager; public function __construct($_name) { $this--->name = $_name; } //设置管理者上级 public function SetHeader(Manager $_mana) { $this->manager = $_mana; } //申请请求 abstract public function Apply(Request $_req); } //经理 class CommonManager extends Manager { public function __construct($_name) { parent::__construct($_name); } public function Apply(Request $_req) { if($_req->requestType==请假 && $_req->num<=2) { echo {$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。 ; } else { if(isset($this->manager)) { $this->manager->Apply($_req); } } } } //总监 class MajorDomo extends Manager { public function __construct($_name) { parent::__construct($_name); } public function Apply(Request $_req) { if ($_req->requestType == 请假 && $_req->num <= 5) { echo {$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。 ; } else { if (isset($this->manager)) { $this->manager->Apply($_req); } } } } //总经理 class GeneralManager extends Manager { public function __construct($_name) { parent::__construct($_name); } public function Apply(Request $_req) { if ($_req->requestType == 请假) { echo {$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。 ; } else if($_req->requestType==加薪 && $_req->num <= 500) { echo {$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。 ; } else if($_req->requestType==加薪 && $_req->num>500) { echo {$this->name}:{$_req->requestContent} 数量{$_req->num}再说吧。 ; } } }
调用客户端代码:
header(Content-Type:text/html;charset=utf-8); //--------------------职责链模式---------------------- require_once ./Responsibility/Responsibility.php; $jingli = new CommonManager(李经理); $zongjian = new MajorDomo(郭总监); $zongjingli = new GeneralManager(孙总); //设置直接上级 $jingli->SetHeader($zongjian); $zongjian->SetHeader($zongjingli); //申请 $req1 = new Request(); $req1->requestType = 请假; $req1->requestContent = 小菜请假!; $req1->num = 1; $jingli->Apply($req1); $req2 = new Request(); $req2->requestType = 请假; $req2->requestContent = 小菜请假!; $req2->num = 4; $jingli->Apply($req2); $req3 = new Request(); $req3->requestType = 加薪; $req3->requestContent = 小菜请求加薪!; $req3->num = 500; $jingli->Apply($req3); $req4 = new Request(); $req4->requestType = 加薪; $req4->requestContent = 小菜请求加薪!; $req4->num = 1000; $jingli->Apply($req4);
适用场景:
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。
至此,PHP设计模式系列教程全部更新结束,欢迎大家批评指正。你的只言片语是我前进的动力。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

在Java框架中,设计模式和架构模式的区别在于:设计模式定义了在软件设计中解决常见问题的抽象解决方案,关注类和对象之间的交互,如工厂模式。架构模式定义了系统结构和模块之间的关系,关注系统组件的组织和交互,如分层架构。

装饰器模式是一种结构型设计模式,允许动态添加对象功能,无需修改原始类。它通过抽象组件、具体组件、抽象装饰器和具体装饰器的协作实现,可以灵活扩展类功能,满足变化的需求。示例中,将牛奶和摩卡装饰器添加到Espresso,总价为2.29美元,展示了装饰器模式在动态修改对象行为方面的强大功能。

适配器模式是一种结构型设计模式,允许不兼容对象协同工作,它将一个接口转换为另一个,使对象能够顺利交互。对象适配器通过创建包含被适配对象的适配器对象,并实现目标接口,实现适配器模式。在一个实战案例中,通过适配器模式,客户端(如MediaPlayer)可以播放高级格式的媒体(如VLC),尽管其本身仅支持普通媒体格式(如MP3)。

1.工厂模式:分离对象创建和业务逻辑,通过工厂类创建指定类型的对象。2.观察者模式:允许主题对象通知观察者对象其状态更改,实现松耦合和观察者模式。

TDD用于编写高质量PHP代码,步骤包括:编写测试用例,描述预期功能并使其失败。编写代码,仅使测试用例通过,无需过分优化或详细设计。测试用例通过后,优化和重构代码以提高可读性、可维护性和可扩展性。

设计模式通过提供可重用和可扩展的解决方案来解决代码维护难题:观察者模式:允许对象订阅事件,并在事件发生时收到通知。工厂模式:提供了一种创建对象的集中式方式,而无需依赖具体类。单例模式:确保一个类只有一个实例,用于创建全局可访问的对象。

Java框架中使用设计模式的优点包括:代码可读性、可维护性和可扩展性增强。缺点包括:过度使用导致复杂性、性能开销以及学习曲线陡峭。实战案例:代理模式用于延迟加载对象。明智地使用设计模式可充分利用其优势并最小化缺点。

Guice框架应用了多项设计模式,包括:单例模式:通过@Singleton注解确保类只有一个实例。工厂方法模式:通过@Provides注解创建工厂方法,在依赖注入时获取对象实例。策略模式:将算法封装成不同策略类,通过@Named注解指定具体策略。
