装饰者模式
<?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框架关键技术解析