Structural Design Pattern: Decorators

As per Wiki structural design patterns are design patterns that ease the design by identifying a simple way to realize relationships among entities. In this post we will discuss Decorators.

Decorators, add additional features to object dynamically without using sub-classing

Let’s consider an analogy here, our bakery needs some automation, everyday I spend few hours setting up appliances like pre-heating the oven, setting kitchen temperature, cleaning utensils this consumes a lot of my time, I could spend that time in creating new dishes, how can I automate this, without employing extra hands?

I have been hearing about this Internet of things a lot lately, I think this is what I need. So I made an app that get readings from all my devices, the functions of this app is:

  • Set temperature for kitchen
  • Set temperature for oven
  • Turn on the Dishwasher
  • Turn off Oven
  • Turn off Dishwasher
  • Send Notification in case of Fire/ Burglary

decor

So this inheritance model works just fine, but the issue is what if I have to do multiple things together? Like Set temperature for both oven and thermostat, or turn off all appliances. In such a case Inheritance wold not be  solution, reason being:

  1. Inheritance is not Dynamic, you will not be able to change the behavior of object at run-time
  2.   Multiple inheritance, most languages doesn’t support it.
  3. Tightly coupled (Coupling and Cohesion)

Solution to this problem would be object that could be linked to our object,  This can be refereed to as a Wrapper or Decorator.

Below is an implementation of how decorator works.

from datetime import datetime
from functools import wraps


def turn_on_appliances(function):
    """ Defines this decorator """
    @wraps(function)
    def decorator():
        appliance_status = 'Off'
        """ Takes the return value of the function being decorated """
        value = function()

        if datetime.now().hour <= 10:
            appliance_status = 'On'
        status = "The status the appliance is --> {}".format(appliance_status)
        return status

    return decorator

@turn_on_appliances
def appliance_status_function():
    """Original Function """
    return ("Status of appliance")

#Check the result of decorating
print(appliance_status_function())

#Check if the function name is still the same name of the function being decorated
print(appliance_status_function.__name__)

#Check if the docstring is still the same as that of the function being decorated
print(appliance_status_function.__doc__)

 

Hope this was useful stay tuned for more on Structural Design Patterns.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s