Fork me on GitHub

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

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

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

 

posted @ 2016-11-23 13:59  lovecucu  阅读(245)  评论(0编辑  收藏  举报