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

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

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

  • 相关阅读:
    C++——修改gcc版本优先级,多版本gcc共存
    C++——pic 与PIC的异同
    Java源码执行顺序
    ubuntu开机鼠标键盘没反应
    加载动态库失败
    ubuntu 重启网络
    交叉编译iperf3
    查看动态库的函数名
    UI组件Kendo UI for jQuery数据管理入门指南 TaskBoard/列
    B/S端界面控件DevExtreme ASP.NET MVC入门指南 调用方法
  • 原文地址:https://www.cnblogs.com/lovecucu/p/6092882.html
Copyright © 2020-2023  润新知