From 4c0fbf4a7cdc8a4af41a09448eb4a1e55d306c1e Mon Sep 17 00:00:00 2001 From: Dominik Liebler Date: Fri, 22 Jun 2018 10:06:50 +0200 Subject: [PATCH] refactored Decorator pattern --- Structural/Decorator/Booking.php | 10 ++++++ Structural/Decorator/BookingDecorator.php | 16 ++++++++++ Structural/Decorator/DoubleRoomBooking.php | 16 ++++++++++ Structural/Decorator/ExtraBed.php | 18 +++++++++++ Structural/Decorator/JsonRenderer.php | 11 ------- Structural/Decorator/README.rst | 20 ++++++------ Structural/Decorator/RenderableInterface.php | 8 ----- Structural/Decorator/RendererDecorator.php | 24 -------------- Structural/Decorator/Tests/DecoratorTest.php | 33 +++++++++++--------- Structural/Decorator/Webservice.php | 21 ------------- Structural/Decorator/WiFi.php | 18 +++++++++++ Structural/Decorator/XmlRenderer.php | 15 --------- 12 files changed, 107 insertions(+), 103 deletions(-) create mode 100644 Structural/Decorator/Booking.php create mode 100644 Structural/Decorator/BookingDecorator.php create mode 100644 Structural/Decorator/DoubleRoomBooking.php create mode 100644 Structural/Decorator/ExtraBed.php delete mode 100644 Structural/Decorator/JsonRenderer.php delete mode 100644 Structural/Decorator/RenderableInterface.php delete mode 100644 Structural/Decorator/RendererDecorator.php delete mode 100644 Structural/Decorator/Webservice.php create mode 100644 Structural/Decorator/WiFi.php delete mode 100644 Structural/Decorator/XmlRenderer.php diff --git a/Structural/Decorator/Booking.php b/Structural/Decorator/Booking.php new file mode 100644 index 0000000..1ce0146 --- /dev/null +++ b/Structural/Decorator/Booking.php @@ -0,0 +1,10 @@ +booking = $booking; + } +} diff --git a/Structural/Decorator/DoubleRoomBooking.php b/Structural/Decorator/DoubleRoomBooking.php new file mode 100644 index 0000000..9d745d7 --- /dev/null +++ b/Structural/Decorator/DoubleRoomBooking.php @@ -0,0 +1,16 @@ +booking->calculatePrice() + self::PRICE; + } + + public function getDescription(): string + { + return $this->booking->getDescription() . ' with extra bed'; + } +} diff --git a/Structural/Decorator/JsonRenderer.php b/Structural/Decorator/JsonRenderer.php deleted file mode 100644 index 9cc4066..0000000 --- a/Structural/Decorator/JsonRenderer.php +++ /dev/null @@ -1,11 +0,0 @@ -wrapped->renderData()); - } -} diff --git a/Structural/Decorator/README.rst b/Structural/Decorator/README.rst index 702fe12..aa16655 100644 --- a/Structural/Decorator/README.rst +++ b/Structural/Decorator/README.rst @@ -25,33 +25,33 @@ Code You can also find this code on `GitHub`_ -RenderableInterface.php +Booking.php -.. literalinclude:: RenderableInterface.php +.. literalinclude:: Booking.php :language: php :linenos: -Webservice.php +BookingDecorator.php -.. literalinclude:: Webservice.php +.. literalinclude:: BookingDecorator.php :language: php :linenos: -RendererDecorator.php +DoubleRoomBooking.php -.. literalinclude:: RendererDecorator.php +.. literalinclude:: DoubleRoomBooking.php :language: php :linenos: -XmlRenderer.php +ExtraBed.php -.. literalinclude:: XmlRenderer.php +.. literalinclude:: ExtraBed.php :language: php :linenos: -JsonRenderer.php +WiFi.php -.. literalinclude:: JsonRenderer.php +.. literalinclude:: WiFi.php :language: php :linenos: diff --git a/Structural/Decorator/RenderableInterface.php b/Structural/Decorator/RenderableInterface.php deleted file mode 100644 index 07e11d1..0000000 --- a/Structural/Decorator/RenderableInterface.php +++ /dev/null @@ -1,8 +0,0 @@ -wrapped = $renderer; - } -} diff --git a/Structural/Decorator/Tests/DecoratorTest.php b/Structural/Decorator/Tests/DecoratorTest.php index 100100d..d1c7638 100644 --- a/Structural/Decorator/Tests/DecoratorTest.php +++ b/Structural/Decorator/Tests/DecoratorTest.php @@ -2,32 +2,37 @@ namespace DesignPatterns\Structural\Decorator\Tests; -use DesignPatterns\Structural\Decorator; +use DesignPatterns\Structural\Decorator\DoubleRoomBooking; +use DesignPatterns\Structural\Decorator\ExtraBed; +use DesignPatterns\Structural\Decorator\WiFi; use PHPUnit\Framework\TestCase; class DecoratorTest extends TestCase { - /** - * @var Decorator\Webservice - */ - private $service; - - protected function setUp() + public function testCanCalculatePriceForBasicDoubleRoomBooking() { - $this->service = new Decorator\Webservice('foobar'); + $booking = new DoubleRoomBooking(); + + $this->assertEquals(40, $booking->calculatePrice()); + $this->assertEquals('double room', $booking->getDescription()); } - public function testJsonDecorator() + public function testCanCalculatePriceForDoubleRoomBookingWithWiFi() { - $service = new Decorator\JsonRenderer($this->service); + $booking = new DoubleRoomBooking(); + $booking = new WiFi($booking); - $this->assertEquals('"foobar"', $service->renderData()); + $this->assertEquals(42, $booking->calculatePrice()); + $this->assertEquals('double room with wifi', $booking->getDescription()); } - public function testXmlDecorator() + public function testCanCalculatePriceForDoubleRoomBookingWithWiFiAndExtraBed() { - $service = new Decorator\XmlRenderer($this->service); + $booking = new DoubleRoomBooking(); + $booking = new WiFi($booking); + $booking = new ExtraBed($booking); - $this->assertXmlStringEqualsXmlString('foobar', $service->renderData()); + $this->assertEquals(72, $booking->calculatePrice()); + $this->assertEquals('double room with wifi with extra bed', $booking->getDescription()); } } diff --git a/Structural/Decorator/Webservice.php b/Structural/Decorator/Webservice.php deleted file mode 100644 index 6715a22..0000000 --- a/Structural/Decorator/Webservice.php +++ /dev/null @@ -1,21 +0,0 @@ -data = $data; - } - - public function renderData(): string - { - return $this->data; - } -} diff --git a/Structural/Decorator/WiFi.php b/Structural/Decorator/WiFi.php new file mode 100644 index 0000000..4226002 --- /dev/null +++ b/Structural/Decorator/WiFi.php @@ -0,0 +1,18 @@ +booking->calculatePrice() + self::PRICE; + } + + public function getDescription(): string + { + return $this->booking->getDescription() . ' with wifi'; + } +} diff --git a/Structural/Decorator/XmlRenderer.php b/Structural/Decorator/XmlRenderer.php deleted file mode 100644 index 012da47..0000000 --- a/Structural/Decorator/XmlRenderer.php +++ /dev/null @@ -1,15 +0,0 @@ -wrapped->renderData(); - $doc->appendChild($doc->createElement('content', $data)); - - return $doc->saveXML(); - } -}