资讯专栏INFORMATION COLUMN

PHP设计模式- Decorator 装饰器模式

caikeal / 372人阅读

整理一下自己的学习Aaron Saray 写的PHP设计模式一些demo和自己的理解。大佬看完如果发现鄙人理解有误请立即指出,感谢拍砖,跪求鞭打

/**
 * Decorator 装饰器模式
 * -------------------------------------
 * ** 来自说明 **
 *
 * 如果已有对象的部分内容或功能性发生改变,但是不需要修改原始的结构
 *
 * 刚开始楼主觉得这个他么怎么这么像 【 适配器模式 】
 * 然后又把适配器模式的理论复制了过来给各位观众老爷看
 * 
 * |-> 适配器模式: * 通过适配器模式能够使用新的代码和功能性来帮助更新原有的系统。
 *
 * 前面演练过了,适配器还是需要继承原对象来实现,但是我们最开始学习面向对象编程时候
 * 如果对象开始要求启用过多的子类,那么相应的代码就会牺牲编程人员的理解力和可维护性
 * 通常,我们会竭力保证用于一个对象的父-子类关系不超过3个
 * 
 * 
 * ===================================== 
 * ** 应用场景 **
 *
 * 迭代新的应用需求
 * 
 * -------------------------------------
 * 
 * @version ${Id}$
 * @author Shaowei Pu <54268491@qq.com>
 */
// 现在你是一个农场饲养员,主要负责养猪方面工作

/**
 * 饲养类
 */
class feeding{

    /**
     * [$mess_tin 饭盒]
     * @var array
     */
    public $mess_tin = [];

    /**
     * [feed 喂食物]
     * @author         Shaowei Pu 
     * @CreateTime    2017-02-23T19:47:18+0800
     * @param                               [type] $food [description]
     * @return                              [type]       [description]
     */
    public function feed( $food ){
        $this->mess_tin[] = $food;
    }
    /**
     * [getHow 吃了哪些东西]
     * @author         Shaowei Pu 
     * @CreateTime    2017-02-23T19:51:41+0800
     * @return                              [type] [description]
     */
    public function getHow(){
        return $this->mess_tin;
    }
}

// 以前你通过这样的方式可以喂猪
$you = new feeding;

// 然后老板给了这些食物
$bread = [        
        "apple",
        "tangerine",
        "banana",
    ];

foreach ($bread as $key => $value) {
    $you->feed($value);
}

// 看看吃了些啥
var_dump( $you->getHow() );
/* 
+----------------------------------------------------------------------
|array (size=3)
|  0 => string "apple" (length=5)
|  1 => string "tangerine" (length=9)
|  2 => string "banana" (length=6)
+----------------------------------------------------------------------
*/

// 但是有天高级饲养说这喂的这些食物都是小写的 这不行,给猪必须要大写的
// 然后你看了下饲养类,听隔壁兄弟这个类不仅仅用在猪身上
// 也有养羊事业部,羊牛事业部,同样用的这个类
// 你不能瞎几把乱改
// 学了适配器的你马上想到了 使用【适配器模式】可以解决问题
// 但是立马老大就说了不准乱继承。一个父类最多继承 3 个子类
// 于是聪明的你想到了这样一个方法

/**
 * 养猪事业部专用
 */
class feddingDecorator{

    /**
     * [$_feeding 基类容器]
     * @var array
     */
    private $_feeding = [];

    /**
     * [__construct 基类入变量]
     * @author         Shaowei Pu 
     * @CreateTime    2017-02-23T20:00:58+0800
     * @param                               feeding $feeding [description]
     */
    public function __construct( feeding $feeding )
    {
        $this->_feeding = $feeding;
    }

    /**
     * [expertFeed 高级食物转换器]
     * @author         Shaowei Pu 
     * @CreateTime    2017-02-23T20:04:42+0800
     * @return                              [type] [description]
     */
    public function expertFeed()
    {
        array_walk($this->_feeding->mess_tin, function( &$value ){
            $value = strtoupper( $value );
        });
    }
}

// 然后这样,前期您还是放心喂

$me = new feeding;
foreach ($bread as $key => $value) {
    $me->feed($value);
}

// 然后你喂完了就开始用的养猪专业部使用的高科技了
$stm = new feddingDecorator( $me );
$stm->expertFeed();
// 看看吃了啥
var_dump($me-> getHow());

/* 
+----------------------------------------------------------------------
|array (size=3)
| 0 => string "APPLE" (length=5)
| 1 => string "TANGERINE" (length=9)
| 2 => string "BANANA" (length=6)
+----------------------------------------------------------------------
*/

// 掌声经久不息

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9764.html

相关文章

  • PHP设计模式- Decorator 装饰模式

    整理一下自己的学习Aaron Saray 写的PHP设计模式一些demo和自己的理解。大佬看完如果发现鄙人理解有误请立即指出,感谢拍砖,跪求鞭打 /** * Decorator 装饰器模式 * ------------------------------------- * ** 来自说明 ** * * 如果已有对象的部分内容或功能性发生改变,但是不需要修改原始的结构 * * 刚开...

    Salamander 评论0 收藏0
  • PHP设计模式- Decorator 装饰模式

    整理一下自己的学习Aaron Saray 写的PHP设计模式一些demo和自己的理解。大佬看完如果发现鄙人理解有误请立即指出,感谢拍砖,跪求鞭打 /** * Decorator 装饰器模式 * ------------------------------------- * ** 来自说明 ** * * 如果已有对象的部分内容或功能性发生改变,但是不需要修改原始的结构 * * 刚开...

    bluesky 评论0 收藏0
  • PHP设计模式- Decorator 装饰模式

    整理一下自己的学习Aaron Saray 写的PHP设计模式一些demo和自己的理解。大佬看完如果发现鄙人理解有误请立即指出,感谢拍砖,跪求鞭打 /** * Decorator 装饰器模式 * ------------------------------------- * ** 来自说明 ** * * 如果已有对象的部分内容或功能性发生改变,但是不需要修改原始的结构 * * 刚开...

    ?xiaoxiao, 评论0 收藏0
  • PHP设计模式装饰模式

    摘要:概念装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 概念 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的...

    CloudwiseAPM 评论0 收藏0
  • 装饰模式Decorator Pattern)

    摘要:通常有两种方式可以实现给一个类或对象增加行为继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。 装饰模式 (Decorator Pattern) 装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。通常有两种方式可以实现给一个类或对象增加行为: 继承机制,使用继承机制是给现有类添加功能的一种...

    gityuan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<