diff --git a/README.md b/README.md index 8d5ee97..e8e3499 100644 --- a/README.md +++ b/README.md @@ -930,7 +930,118 @@ vary independently." #### Programmatic Example -TODO +Translating our WebPage example from above. Here we have the web page hierarchy. + +```cpp +class WebPage +{ + public: + virtual std::string getContent(void) = 0; +}; + +class About : public WebPage +{ + public: + About(Theme::ptr_t theme) + : theme_(theme) + { + } + + std::string getContent(void) + { + return "About page in " + theme_->getColor(); + } + + private: + Theme::ptr_t theme_; +}; + +class Projects : public WebPage +{ + public: + Projects(Theme::ptr_t theme) + : theme_(theme) + { + } + + std::string getContent(void) + { + return "Projects page in " + theme_->getColor(); + } + + private: + Theme::ptr_t theme_; +}; + + +class Careers : public WebPage +{ + public: + Careers(Theme::ptr_t theme) + : theme_(theme) + { + } + + std::string getContent(void) + { + return "Careers page in " + theme_->getColor(); + } + + private: + Theme::ptr_t theme_; +}; +``` + +And the separate theme hierarchy. + +```cpp +class Theme +{ + public: + typedef std::shared_ptr ptr_t; + virtual std::string getColor(void) = 0; +}; + +class DarkTheme : public Theme +{ + public: + std::string getColor(void) + { + return "dark palette"; + } +}; + +class LightTheme : public Theme +{ + public: + std::string getColor(void) + { + return "light palette"; + } +}; + +class AquaTheme : public Theme +{ + public: + std::string getColor(void) + { + return "aqua palette"; + } +}; +``` + +Here is how this can be used: + +```cpp +Theme::ptr_t darkTheme = std::make_shared(); +About about(darkTheme); +Careers careers(darkTheme); + +// Output: About page in dark palette +std::cout << about.getContent() << std::endl; +// Output: Careers page in dark palette +std::cout << careers.getContent() << std::endl; +``` #### When To Use @@ -962,7 +1073,6 @@ objects and compositions uniformly. #### Programmatic Example -TODO #### When To Use