3

概念:

装饰模式: 顾名思义,装饰模式是一种对对象数据的多次过滤,就像装饰一样, 一层层的修饰, 获取满意的结果。
装饰模式共分为两个部分:
1: 装饰者: 在这个接口接口下面的类和方法用以对数据进行修饰(即对数据进行过滤修改)
2: 被装饰者: 这个就是要被过滤的数据接口对象

情景:

  炒菜之前要对买来的菜进行拣菜, 洗菜等操作。这个就类似于装饰操作, 装饰者就是洗净的过程操作, 被装饰者就是菜。

实现:

 //装饰者
 abstract class Decorator
 {
     //装饰操作
    abstract function process(Cai $cai);
 }

 class XiCai extends Decorator
 {
    public function process(Cai $cai)
    {
        echo '这是个洗菜操作。<br />';
    }
 }


//被装饰者
 abstract class Cai
 {

    abstract function getGanJingZhi();
 }

//青菜
 class QingCai extends Cai
 {
    public function getGanJingZhi()
    {
        return 2;
    }
 }

//白菜
 class BaiCai extends Cai
 {
    public function getGanJingZhi()
    {
        return 3;
    }
 }

//让已经装饰的装饰者再进行新的装饰,表示多步过滤
abstract class DecorateActor extends Decorator
{
    protected $decorator;
    public function __construct(Decorator $d)
    {
        $this->decorator = $d;
    }

    function process(Cai $cai)
    {
        $this->decorator->process($cai);
    }
}

//拣菜操作
 class JianCai extends DecorateActor
 {
    public function process(Cai $cai)
    {
        echo '这是个拣菜操作。<br />';
        parent::process($cai);  //进行下一步过滤
    }
 }

//泡菜操作
 class PaoCai extends DecorateActor
 {
     public function process(Cai $cai)
    {
        echo '这是个浸泡操作。<br />';
        parent::process($cai); //进行下一步过滤
    }
 }

$cai = new QingCai();
$process = new JianCai(new PaoCai(new XiCai($cai)));
$process->process($cai);

结果:

这是个拣菜操作。
这是个浸泡操作。
这是个洗菜操作。

总结: 当我们需要对数据进行过滤的时候, 装饰模式可以成为你的选择


Yi_Zhi_Yu
1.9k 声望69 粉丝

PHPer,Sphinxer,Giter,Sheller,Pythoner