PHP常见设计模式二

6.装饰器模式

理解:达到动态修改类方法的目的,比如模板文字,我想把他改成红色的。
 与观察者模式类似,观察者模式是将观察者在事件发生的时候注册到事件类中,并且发送给所有观察者
 装饰器是将要在装饰的时候,在触发类里面注册装饰器已经前置 后置操作
class Template{
    protected $decorator;

    public function index(){
        $this->before();
        echo '我是一个模板';
        $this->after();
    }

    //添加装饰器
    public function addDecorator(decorator $decorator){
        $this->decorator[] = $decorator;
    }

    //前置操作 要遵循先入先出
    protected function before(){
        if(empty($this->decorator)) return;
        foreach ($this->decorator as $dec){
            $dec->before();
        }
    }
    //后置操作 要遵循先入后出
    protected function after(){
        if(empty($this->decorator)) return;
        $this->decorator = array_reverse($this->decorator);
        foreach ($this->decorator as $dec){
            $dec->after();
        }
    }
}

//装饰器
interface Decorator{
    public function before();
    public function after();
}

//装饰颜色
class Color implements Decorator{

    protected $color;
    public function __construct($color)
    {
        $this->color = $color;
    }

    public function before()
    {
        // TODO: Implement before() method.
        echo "<dis style='color: {$this->color}'>";
    }
    public function after()
    {
        // TODO: Implement after() method.
        echo "</div>";
    }
}

class Size implements Decorator{
    protected $size;
    public function __construct($size)
    {
        $this->size = $size;
    }
    public function before()
    {
        // TODO: Implement before() method.
        echo "<dis style='font-size: {$this->size}'>";
    }
    public function after()
    {
        // TODO: Implement after() method.
        echo "</div>";
    }
}

//实例化模板
$temp = new Template();
$temp->index();
echo '<br/>';
//增加红色装饰器
$temp->addDecorator(new Color('red'));
//增加字体装饰器
$temp->addDecorator(new Size('20px'));
$temp->index();

7.代理模式

理解:在客户端和实体之间,建立一个代理对象(proxy),客户端对实体进行的操作,全部委派给代理对象,隐藏实体的具体实现细节。
interface User{
    public function getName();
    public function getAge();
}

//实际处理类
class Getinfo implements User{

    public function getName()
    {
        // TODO: Implement getName() method.
        echo '我的名字叫张三<br>';
    }

    public function getAge()
    {
        // TODO: Implement getAge() method.
        echo '我今年18岁了';
    }


}

//代理类
class Porxy implements User{
    protected $real;
    public function __construct(Getinfo $real)
    {
        $this->real = $real;
    }

    public function getName()
    {
        // TODO: Implement getName() method.
        $this->real->getName();
    }
    public function getAge()
    {
        // TODO: Implement getAge() method.
        $this->real->getAge();
    }
}

$porxy = new Porxy(new Getinfo());

$porxy->getName();
$porxy->getAge();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值