举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > php装饰器模式场景 PHP 装饰器模式

php装饰器模式场景 PHP 装饰器模式

2023-04-26 17:18 PHP设计模式

php装饰器模式场景 PHP 装饰器模式

php装饰器模式场景 PHP 装饰器模式

php装饰器模式场景

目的

动态地为类的实例添加功能

例子

  • Web Service层:REST服务的JSON与XML装饰器(当然,在此只能使用其中的一种)

UML 图

Alt Decorator UML Diagram

 代码

Booking.php

<?php

declare(strict_types=1);

namespace DesignPatternsStructuralDecorator;

interface Booking
{
    public function calculatePrice(): int;

    public function getDescription(): string;
}

BookingDecorator.php

<?php

declare(strict_types=1);

namespace DesignPatternsStructuralDecorator;

abstract class BookingDecorator implements Booking
{
    public function __construct(protected Booking $booking)
    {
    }
}

DoubleRoomBooking.php

<?php

declare(strict_types=1);

namespace DesignPatternsStructuralDecorator;

class DoubleRoomBooking implements Booking
{
    public function calculatePrice(): int
    {
        return 40;
    }

    public function getDescription(): string
    {
        return "double room";
    }
}

ExtraBed.php

<?php

declare(strict_types=1);

namespace DesignPatternsStructuralDecorator;

class ExtraBed extends BookingDecorator
{
    private const PRICE = 30;

    public function calculatePrice(): int
    {
        return $this->booking->calculatePrice() + self::PRICE;
    }

    public function getDescription(): string
    {
        return $this->booking->getDescription() . " with extra bed";
    }
}

WiFi.php

<?php

declare(strict_types=1);

namespace DesignPatternsStructuralDecorator;

class WiFi extends BookingDecorator
{
    private const PRICE = 2;

    public function calculatePrice(): int
    {
        return $this->booking->calculatePrice() + self::PRICE;
    }

    public function getDescription(): string
    {
        return $this->booking->getDescription() . " with wifi";
    }
}

测试

Tests/DecoratorTest.php

<?php

declare(strict_types=1);

namespace DesignPatternsStructuralDecoratorTests;

use DesignPatternsStructuralDecoratorDoubleRoomBooking;
use DesignPatternsStructuralDecoratorExtraBed;
use DesignPatternsStructuralDecoratorWiFi;
use PHPUnitFrameworkTestCase;

class DecoratorTest extends TestCase
{
    public function testCanCalculatePriceForBasicDoubleRoomBooking()
    {
        $booking = new DoubleRoomBooking();

        $this->assertSame(40, $booking->calculatePrice());
        $this->assertSame("double room", $booking->getDescription());
    }

    public function testCanCalculatePriceForDoubleRoomBookingWithWiFi()
    {
        $booking = new DoubleRoomBooking();
        $booking = new WiFi($booking);

        $this->assertSame(42, $booking->calculatePrice());
        $this->assertSame("double room with wifi", $booking->getDescription());
    }

    public function testCanCalculatePriceForDoubleRoomBookingWithWiFiAndExtraBed()
    {
        $booking = new DoubleRoomBooking();
        $booking = new WiFi($booking);
        $booking = new ExtraBed($booking);

        $this->assertSame(72, $booking->calculatePrice());
        $this->assertSame("double room with wifi with extra bed", $booking->getDescription());
    }
}



阅读全文
以上是编程学为你收集整理的php装饰器模式场景 PHP 装饰器模式全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • uml交互有哪些 UML交互

    uml交互有哪些 UML交互

    2023-06-19 UML教程

    UML 交互图概述:UML 交互图描述的是对象之间的动态合作关系以及合作过程中的行为次序。UML 交互图常常用来描述一个用例的行为,...

  • 策略模式代替if else 策略模式

    策略模式代替if else 策略模式

    2023-05-26 设计模式

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中...

  • 拦截过滤器模式有哪些 拦截过滤器模式

    拦截过滤器模式有哪些 拦截过滤器模式

    2023-06-12 设计模式

    拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实...

  • oceanbase语法支持 OceanBase 复用语句对象

    oceanbase语法支持 OceanBase 复用语句对象

    2023-04-09

    OceanBase Connector/J 的语句池功能允许应用程序以与使用 Connection 对象相同的方式重用​PreparedStatement​对象。多个逻辑...

  •  Moralis SDK示例模板

    Moralis SDK示例模板

    2023-04-20

    Web3VanillaJavascript入门项目这是一个简单的应用程序登录用户,在Moralis数据库中创建用户配置文件并将用户事务同步到Moralis...

© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部