php中的装饰模式
今天看了几篇牛人博客,发现同是90后为何人家这么厉害,而我还只是个刚入门的phper。深究原因有两点:入门较晚,学习不够刻苦。其中第二点我认为是最重要的,因为在工作的这一年里没有过努力学习而感动自己的瞬间,也没有项目完成后无比自豪的瞬间。取而代之的却是因太多知识要学或是先学什么等问题引来的焦虑,我相信多数初学者都或多或少的和我有着类似的困扰。我也想成为大牛,我也知道这条路漫长而艰辛,可是为了美好的明天,为了自己的爱好,我愿意为之奋斗终身,请大家为我见证。
好了,先感伤到这,我们来开始今天的主题----php的装饰模式:
费话少说,先上代码,然后根据代码讲解这个666的装饰模式。
# http请求 class HttpRequest {} # 处理请求的抽象类,用于规范所有处理子类必须实现process方法 abstract class ProcessRequest { abstract function process( HttpRequest $req); } # 主程序用于执行该请求的核心任务 class MainProcess extends ProcessRequest { function process(HttpRequest $req) { echo '主程序执行完成<br />'; } } # 用于对主程序加工的装饰抽象类 abstract class ProcessDecorator extends ProcessRequest { protected $ProcessRequest; function __construct( ProcessRequest $pr) { $this->ProcessRequest = $pr; } } # 主程序执行前记录访问日志 class LogRequest extends ProcessDecorator { function process(HttpRequest $req) { echo '记录访问日志完成<br />'; $this->ProcessRequest->process($req); } } # 主程序执行前执行权限验证 class AuthenticateRequest extends ProcessDecorator { function process(HttpRequest $req) { echo '执行权限验证操作完成<br />'; $this->ProcessRequest->process($req); } } # 定义请求,需要执行log和auth的功能 $process = new LogRequest(new AuthenticateRequest(new MainProcess())); $process->process(new HttpRequest());
由注释可知,上面代码是用来处理一个请求的,这个请求包括权限验证,纪录日志,核心功能等步骤。在面向过程的代码中,这些功能大都是显性的硬编码在客户端业务逻辑中的,如果业务逻辑有改动,可能修改起来会比较繁琐。但是在上面的例子中客户端的代码仅短短2行,就完成了权限验证,纪录日志等处理,相当简洁,修改也比较方便。这里就是用到了我们今天讲的装饰模式,通过装饰模式减少了类的多重继承,将主程序(mainProcess)组合到功能类(logProcess,authenticProcess)中,在功能类中实现和主程序同样的方法,方法内部先实现功能类的功能,再调用主程序来处理请求。整体逻辑就是在执行主程序代码之前,通过将主程序层层的组合到功能类中,完成对应功能,最后再执行主程序。
上面例子中需要注意的地方:
1.首先,装饰类和产品类需共享同一个父类接口(ProcessRequest)
2.其次,装饰类中必须有产品类(或者其他装饰类)的实例,这样才能在执行该装饰功能后,继续执行原先产品类(或者其他装饰类的功能)。
3.最后,可以根据装饰类的不同组合顺序,按照不同顺序执行这些功能操作(log和auth)。
装饰模式功能非常强大,在JAVA的I/O包中也广泛应用了装饰器类,有兴趣可以看看。
以上就是本人对装饰模式的初步理解,感谢您的阅读。
注:因本人的技术有限,如果有理解错误的地方,还请各位批评指正,共同交流学习,谢谢。我会继续努力的。