装饰者模式

<?php

interface  Decorator
{

    public function display();
}

class XiaoFang implements Decorator
{
    private $name;
    public function __construct($name)
    {
        $this->name=$name;
    }
    public function display()
    {
        echo "我是".$this->name. " 我是出门了 !!!".'<br>';
    }
}

class Finery implements Decorator
{
    private $component;
    public function __construct(Decorator $component)
    {
        $this->component=$component;
    }
    public function display()
    {
        $this->component->display();
    }
}

class Shoes extends Finery
{
    public function display()
    {
        echo "穿上鞋子".'<br>';
        parent::display();
    }
}

class Skirt extends Finery
{
    public function display()
    {
        echo "穿上裙子".'<br>';
        parent::display();
    }
}

class Fire extends Finery
{
    public function display()
    {
        echo "出门前先整理头发".'<br>';
        parent::display();
        echo "出门后再整理一下头发".'<br>';
    }
}

    $xiaofang =new XiaoFang('小芳');
    $shoes =new Shoes($xiaofang);
    $skirt =new Skirt($shoes);
    $fire =new Fire($skirt);
    $fire->display();

1丶首先我们实例化XiaoFang类,并且传递小芳参数;

2丶触发构造方法并将小芳参数传递,将XiaoFang类的属性name赋值为小芳;

3丶当我们是实例化Shoes,并且将刚刚实例化的xiaofang以参数的形式注入到Shoes类中;

4丶分别以相同的形式实例化Skirt,Fire类;Shoes、Skirt,Fire类分别继承了Finery类;

5、当我们在最后实例化Fire类后调用display方法;

首先输出:出门前整理先头发

调用父类的display方法即Finery的display方法;

6、调用Finery的display方法;Finery类首先会调用其构造方法,将传递的参数赋值给其属性component,在当前操作就是将skirt类赋值给其属性component;当我们调用Finery的display方法时,也就调用了skirt的display方法;

输出:穿上裙子

并且调用其父类的display方法,以此类推分别

输出:穿上鞋子 

我是小芳,我是出门了   !!!

这个时候返回到Fire类中的display方法,这个时候parent::display()l;方法完成;

进行输出:出门后再整理一下头发

即浏览器输出结果总体是:

出门前整理先头发

穿上裙子

穿上鞋子

我是小芳,我是出门了   !!!

出门后再整理一下头发

完成这一系列操作;

这个就是一个装饰者模式;

参考书籍laravel框架关键技术解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值