一天一个设计模式(10)——装饰器模式

装饰器模式

  装饰器模式是为了向一个现有的对象添加新的功能,在不想继承该对象的情况下使用,以避免子类较多的情况。

实例

  天气热的时候我们家宝宝要出门玩可以不换衣服直接出门。现在天气凉了,我想要出门前先穿上衣服,回家就脱掉。

  首先创建一个孩子玩的接口

复制代码
/**
 * Interface Child
 */
interface Child
{
    public function play();
}
Interface Child
复制代码

  夏天的时候想出去玩直接就出门啦

复制代码
class MyChild implements Child
{
    public function play()
    {
        echo 'Go out!';
    }
}
MyChild
复制代码

  创建一个装饰器类

复制代码
class Decorator implements Child
{

    public $decoratorChild;

    /**
     * Decorator constructor.
     * @param $child Child
     */
    function __construct($child)
    {
        $this->decoratorChild = $child;
    }

    public function play()
    {
        $this->decoratorChild->play();
    }
}
Decorator
复制代码

  冬天出门要先穿衣服,回家要脱衣服。

复制代码
class MyChildNew extends Decorator{

    public function first(){
        echo "Wear clothes.";
    }

    public function last(){
        echo "Undress.";
    }

    public function play()
    {
        $this->first();
        parent::play();
        $this->last();
    }

}
MyChildNew
复制代码

  执行结果:

$child=new MyChildNew(new MyChild());
$child->play();

//Wear clothes.Go out!Undress.

 

posted @   Bin_x  阅读(116)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2015-06-08 条件修饰词
点击右上角即可分享
微信分享提示