设计模式-Decrorator(装饰器)
装饰者模式-装饰对象
定义:动态的将责任附加到对象上,若要扩展功能,装饰着模式提供了比继承更有弹性的替代方案
个人理解:其实装饰者模式有点递归的思想,有一点对象传递的知识,假如对字符串的处理上面有A,B,C,D等若干个处理的对象,在某种情况下需要其中一种或者若干种的功能,那么就在这种模式下面就可以把每一个功能单独的编写,不用一次性编写若干个功能。可以提高复用性。
下面的案例如下,在常规的用户信息处理上面不同的功能有不同的安全级别,有些需要过滤html 有些不需要等等,那么只要按照装饰者模式实现每个功能,那么就可以依照不同的情况,直接拿来用。
<?php abstract class Filter{ public function __construct(){} public abstract function filterMsg($msg); } //基础的过滤对象 class CsrfFilter extends Filter{ public function filterMsg($msg){ return 'CSRF攻击已经过滤'.$msg; } } //声明一个装饰器 基类用来提供服务 class FilterDecorator extends Filter{ private $_handle; public function __construct($handle){ $this->_handle = $handle; } public function filterMsg($msg){ return $this->_handle->filterMsg($msg); } } class DirtyWordsFilter extends FilterDecorator{ public function __construct($handle){ parent::__construct($handle); } public function filterMsg($msg){ $msg = '脏字过滤已处理'.$msg; return parent::filterMsg($msg); } } class HtmlFilter extends FilterDecorator{ public function __construct($handle){ parent::__construct($handle); } public function filterMsg($msg){ $msg = 'Html标签已经处理过'.$msg; return parent::filterMsg($msg); } } $filter = new HtmlFilter(new DirtyWordsFilter(new CsrfFilter())); echo $filter->filterMsg('待处理的原始数据');