设计模式-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('待处理的原始数据');
