php设计模式之装饰器

装饰器模式的理解:在原来类的基础上改变功能(增加、减少或重写);
实现: 
    原来:一个简单的抽象类,一个实体类实现抽象类,用于简单的功能。
    装饰之后: 装饰抽象类继承原来简单的抽象类,并实现原来抽象类中的抽象方法,
             装饰器的实现类继承装饰器,实现类的构造函数中包含原来简单抽象类的引用,
             实现类实现装饰器类增加的抽象方法和重新原来装饰器类实现抽象类的方法,
             把简单的实体类传递给装饰器的实现类的构造函数即可增加相应的功能。

简单的代码示例:
1.简单的抽象类 TestDecorateBase.php
<?php 
    namespace phpadvanced;

    abstract class TestDecorateBase
    {
        protected $name = "haha";

        abstract public function getName();

2.简单的抽象类实现类 TestDecorateBaseRealize.php
<?php
    namespace phpadvanced;

    include_once("./TestDecorateBase.php");

    class TestDecorateBaseRealize extends TestDecorateBase
    {
        public function getName()
        {
            echo $this->name;
        }
    }

    $obj = new TestDecorateBaseRealize();

    $obj->getName();
结果: haha
3.装饰器抽象类 TestDecorater.php
<?php 
    namespace phpadvanced;

    include_once("./TestDecorateBase.php");

    abstract class TestDecorater extends TestDecorateBase
    {

        abstract public function setName();

        public function getName(){}  //实现抽象类的抽象方法      

    }

4. 装饰器实现类
<?php

    namespace phpadvanced;

    include_once("./TestDecorater.php");
    include_once("./TestDecorateBaseRealize.php");
    include_once("./TestDecorateBase.php");

    class TestDecoratee extends TestDecorater 
    {
        private $TestDecorateBase;

        public function __construct(TestDecorateBase $TestDecorateBase)
        //最重要的地方: 包含原来抽象类 类型的引用
        {
            $this->TestDecorateBase = $TestDecorateBase;
        }

        public function setName() //实现装饰器增加的方法
        {
           $this->TestDecorateBase->name = "hehe";
        }

        public function getName() //改写装饰器实现的方法
        {
            echo $this->TestDecorateBase->name;
        }          

    }

    $objBase = new TestDecorateBaseRealize();

    $objBaseNew = new TestDecoratee($objBase);

    $objBaseNew->setName();
    $objBaseNew->getName();

结果: hehe

装饰器模式很强大,用于不改变现有功能的前提下扩展新的功能,具体使用方法要在实践中体会。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值