From 6f923d9c8c6fd08c7a911eed313cf3d3a7ab0858 Mon Sep 17 00:00:00 2001 From: Ian Dinwoodie Date: Mon, 29 Apr 2019 20:21:47 -0400 Subject: [PATCH] Added decorator example. --- README.md | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 125 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b504343..4cff14a 100644 --- a/README.md +++ b/README.md @@ -1228,7 +1228,131 @@ classes with unique areas of concern. #### Programmatic Example -TODO +Lets take coffee for example. First of all we have a simple coffee implementing +the coffee class + +```cpp +class Coffee +{ + public: + typedef std::shared_ptr ptr_t; + virtual float getPrice(void) = 0; + virtual std::string getDescription(void) = 0; +}; + +class SimpleCoffee : public Coffee +{ + public: + float getPrice(void) + { + return 3; + } + + std::string getDescription(void) + { + return "Simple coffee"; + } +}; +``` + +We want to make the code extensible to allow options to modify it if required. +Lets make some add-ons (decorators) + +```cpp +class MilkCoffee : public Coffee +{ + public: + MilkCoffee(Coffee::ptr_t coffee) + : coffee_(coffee) + { + } + + float getPrice(void) + { + return coffee_->getPrice() + 0.5; + } + + std::string getDescription(void) + { + return coffee_->getDescription() + ", milk"; + } + + private: + Coffee::ptr_t coffee_; +}; + +class WhipCoffee : public Coffee +{ + public: + WhipCoffee(Coffee::ptr_t coffee) + : coffee_(coffee) + { + } + + float getPrice(void) + { + return coffee_->getPrice() + 2; + } + + std::string getDescription(void) + { + return coffee_->getDescription() + ", whip"; + } + + private: + Coffee::ptr_t coffee_; +}; + +class VanillaCoffee : public Coffee +{ + public: + VanillaCoffee(Coffee::ptr_t coffee) + : coffee_(coffee) + { + } + + float getPrice(void) + { + return coffee_->getPrice() + 1; + } + + std::string getDescription(void) + { + return coffee_->getDescription() + ", vanilla"; + } + + private: + Coffee::ptr_t coffee_; +}; +``` + +Here is how this can be used: + +```cpp +Coffee::ptr_t simple = std::make_shared(); +// Output: 3 +std::cout << simple->getPrice() << std::endl; +// Output: Simple coffee +std::cout << simple->getDescription() << std::endl; + +Coffee::ptr_t milk = std::make_shared(simple); +// Output: 3.5 +std::cout << milk->getPrice() << std::endl; +// Output: Simple coffee, milk +std::cout << milk->getDescription() << std::endl; + +Coffee::ptr_t whip = std::make_shared(milk); +// Output: 5.5 +std::cout << whip->getPrice() << std::endl; +// Output: Simple coffee, milk, whip +std::cout << whip->getDescription() << std::endl; + +Coffee::ptr_t vanilla = std::make_shared(whip); +// Output: 6.5 +std::cout << vanilla->getPrice() << std::endl; +// Output: Simple coffee, milk, whip, vanilla +std::cout << vanilla->getDescription() << std::endl; +``` #### When To Use