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

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

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

  • 相关阅读:
    dubbo入门(一)
    java中文件操作《一》
    Unity 游戏框架搭建 2019 (七) 自定义快捷键
    凉鞋:我所理解的框架 【Unity 游戏框架搭建】
    Unity 游戏框架搭建 2019 (六) MenuItem 复用
    Unity 游戏框架搭建 2019 (五) 打开所在文件夹
    Unity 游戏框架搭建 2019 (四) 导出 UnityPackage
    Unity 游戏框架搭建 2019 (三) 生成文件名到剪切板
    Unity 游戏框架搭建 2019 (二) 文本复制到剪切板
    Unity 游戏框架搭建 2019 (一) 简介与第一个示例文件名的生成
  • 原文地址:https://www.cnblogs.com/lovecucu/p/6092882.html
Copyright © 2011-2022 走看看