Hello! Today, we'll venture into the realm of design patterns. Specifically, we'll tackle exercises that apply a single design pattern to problem-solving. Mastering these patterns is a surefire way to extend your coding skills.
Our goal today is to fortify your understanding of when and how to apply specific Object-Oriented Programming (OOP) design patterns. These patterns include Encapsulation, Abstraction, Polymorphism, and Composition.
We'll dissect four real-life scenarios and distinguish which pattern is applicable and why.
Let's get underway!
Real-life Example 1: Database Management System (Encapsulation)
Real-life Example 2: Graphic User Interface (GUI) Development (Polymorphism)
When transitioning to GUI development, consider the creation of controls like buttons or checkboxes. Despite belonging to the same class, each responds differently when clicked. This situation illustrates Polymorphism, which allows us to handle different objects uniformly via a common interface.
Check out this illustrative example:
PHP
<?phpabstract class Control { public function click() { // method that can be overridden }}class Button extends Control { public function click() { echo "Button Clicked!\n"; // overridden method }}class CheckBox extends Control { public function click() { echo "CheckBox Clicked!\n"; // overridden method }}$b = new Button();$c = new CheckBox();// Click Controls$b->click(); // Outputs: Button Clicked!$c->click(); // Outputs: CheckBox Clicked!?>
Despite sharing the common click interface, different controls display unique responses. This characteristic demonstrates Polymorphism.
Join the 1M+ learners on CodeSignal
Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal
The Encapsulation pattern proves beneficial for the development of a Database Management System (DBMS). Each DBMS table represents a class, the fields represent private data members, and the functions operating on this data serve as methods.
Encapsulation ensures that data members are accessed through methods that promote data integrity and prevent inadvertent anomalies. Here's a mini-code snippet to support this concept:
PHP
<?phpclass Employees { private $employees = []; // private data member public function addEmployee($eid, $name) { // method to operate on private data $this->employees[$eid] = $name; } public function updateEmployee($eid, $newName) { // method to operate on private data if (array_key_exists($eid, $this->employees)) { $this->employees[$eid] = $newName; } } public function getEmployee($eid) { // getter method for private data return array_key_exists($eid, $this->employees) ? $this->employees[$eid] : null; }}$employees = new Employees();$employees->addEmployee(1, "John");$employees->addEmployee(2, "Mark");$employees->updateEmployee(2, "Jake");echo $employees->getEmployee(1); // Outputs: Johnecho "\n";echo $employees->getEmployee(2); // Outputs: Jake?>
In this context, Encapsulation restricts direct access to employee data, presenting a protective layer via designated methods.
Real-life Example 3: Creating a Web Page Structure (Composition)
Real-life Example 4: Creating a Vehicle (Abstraction)
Design Pattern Identification
Let's recap the major OOP patterns:
Encapsulation: This pattern confines data and related methods into one unit, veiling direct data access.
Abstraction: This pattern offers a simplified interface, cloaking complexity.
Polymorphism: This pattern facilitates treating different objects as related objects of a common superclass.
Composition: This pattern builds elaborate systems by composing closely related objects.
Reflect on these principles and practice applying them to a variety of scenarios to better recognize suitable patterns.
Lesson Summary
Great job! You've explored the practical applications of OOP design patterns. We've explored the use of Encapsulation in Database Management Systems, the pivotal role of Polymorphism in GUI development, the importance of Composition when designing a web page builder, and how Abstraction helps to build a vehicle structure.
Next up are hands-on exercises to reinforce these concepts. Remember, practice is the master key to understanding these concepts. So keep coding!
Let's explore the Composition design pattern through a PHP approach to creating a simple web page structure. Here, we'll build a fundamental structure representing a webpage composed of various elements like headers, paragraphs, and lists. This abstraction allows us to understand how composite objects work together to form a larger system.
PHP
<?phpinterface IWebPageElement { public function render();}class Header implements IWebPageElement { private $text; public function __construct($text) { $this->text = $text; } public function render() { return "<h1>{$this->text}</h1>"; }}class Paragraph implements IWebPageElement { private $text; public function __construct($text) { $this->text = $text; } public function render() { return "<p>{$this->text}</p>"; }}class ListElement implements IWebPageElement { private $items; public function __construct($items) { $this->items = $items; } public function render() { $itemsStr = ""; foreach ($this->items as $item) { $itemsStr .= "<li>{$item}</li>"; } return "<ul>{$itemsStr}</ul>"; }}class WebPage { private $title; private $elements = []; public function __construct($title) { $this->title = $title; } public function addElement(IWebPageElement $element) { $this->elements[] = $element; } public function display() { $elementsStr = ""; foreach ($this->elements as $element) { $elementsStr .= $element->render() . "\n"; } return "<html>\n<head>\n <title>{$this->title}\n</title>\n</head>\n<body>\n {$elementsStr}\n</body>\n</html>"; }}$page = new WebPage("My Web Page");$page->addElement(new Header("Welcome to My Web Page"));$page->addElement(new Paragraph("This is a paragraph of text on the web page."));$items = ["Item 1", "Item 2", "Item 3"];$page->addElement(new ListElement($items));echo $page->display();?>
In this code, we've designed a web page structure using the Composition design pattern. Each web page element (Header, Paragraph, and ListElement) is an IWebPageElement, allowing for unified handling while maintaining their specific behaviors (rendering as HTML elements).
The WebPage class acts as a composite object that can contain an arbitrary number of IWebPageElement instances, each representing different parts of a web page. By adding these elements to the WebPage and invoking the display method, we dynamically compose a complete web page structure in HTML format.
Consider creating a Vehicle class in PHP. Here, Abstraction comes into play. You expose only the necessary functionality and abstract away the internal workings of the Vehicle.
Let's see this in code:
PHP
<?phpabstract class Vehicle { protected $color; protected $engineType; protected $engineRunning; protected function __construct($color, $engineType) { $this->color = $color; $this->engineType = $engineType; $this->engineRunning = false; } public abstract function startEngine(); public abstract function stopEngine(); public abstract function drive();}class Car extends Vehicle { public function __construct($color, $engineType) { parent::__construct($color, $engineType); } public function startEngine() { $this->engineRunning = true; echo "Car engine started!\n"; } public function stopEngine() { $this->engineRunning = false; echo "Car engine stopped!\n"; } public function drive() { if ($this->engineRunning) { echo "{$this->color} car is driving on the {$this->engineType} engine type!\n"; } else { echo "Start the engine first!\n"; } }}$car = new Car("red", "gasoline");$car->startEngine();$car->drive();?>
Here, the Vehicle abstract class exposes relevant and necessary functions such as startEngine(), stopEngine(), and drive(), while the Car class implements this abstract class and provides concrete implementations. However, it hides or abstracts away internal state management (engineRunning). This is a basic instance of Abstraction, which simplifies interaction with the class and hides underlying complexity.