zoukankan      html  css  js  c++  java
  • 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包中也广泛应用了装饰器类,有兴趣可以看看。

    以上就是本人对装饰模式的初步理解,感谢您的阅读。

    注:因本人的技术有限,如果有理解错误的地方,还请各位批评指正,共同交流学习,谢谢。我会继续努力的。

  • 相关阅读:
    Redis Cluter
    数据库设计范式
    kvm虚拟化
    架构前端
    集群架构
    初识shell编程
    网络知识
    Linux三剑客
    Linux磁盘管理
    高性能异步爬虫
  • 原文地址:https://www.cnblogs.com/lovecucu/p/6092882.html
Copyright © 2011-2022 走看看