Python @ DjangoSpin

PyPro #89 Bridge Design Pattern

Buffer this pageShare on FacebookPrint this pageTweet about this on TwitterShare on Google+Share on LinkedInShare on StumbleUpon
Reading Time: 1 minutes

Bridge Design Pattern in Python

Bridge Design Pattern in Python

Write a Python program to implement Bridge Design Pattern.

# We have a Circle class having 3 attributes and 3 methods.
# Attributes are radius, coordinates on a 2-D plane.
# Methods are drawWithAPIOne(), drawWithAPITwo() and scale(). Of these, the drawing methods are implementation specific as we have two APIs to draw a circle, and it depends on the user which one to use.
# Our purpose here is to separate the Implementation Specific Abstraction and Implementaion Independent Abstraction into two different class hierarchies.
# We wish to keep the Circle class confined to defining its properties and implementation-independent scale() method AND have the draw functionality (which is implementation specific)
# delegated to a separate class hierarchy.
 
class DrawingAPIOne:
        '''Implementation-specific abstraction'''
        def drawCircle(self, x, y, radius):
                print("API 1 is drawing a circle at ({}, {}) with radius {}".format(x, y, radius))
 
class DrawingAPITwo:
        '''Implementation-specific abstraction'''
        def drawCircle(self, x, y, radius):
                print("API 2 is drawing a circle at ({}, {}) with radius {}".format(x, y, radius))
 
class Circle:                       
        def __init__(self, x, y, radius, drawingAPI):
                '''Implementation-independent abstraction; Initialize the necessary attributes'''
                self._x = x
                self._y = y
                self._radius = radius
                self._drawingAPI = drawingAPI
        def draw(self):
                '''Implementation-specific abstraction'''
                self._drawingAPI.drawCircle(self._x, self._y, self._radius)
        def scale(self, percent):
                '''Implementation-independent abstraction'''
                self._radius *= percent
 
# Instantiate a circle and pass to it an object of DrawingAPIOne in its 4rth argument
circle1 = Circle(0, 0, 2, DrawingAPIOne())
# Draw it using API One
circle1.draw()
 
# Instantiate another circle and pass to it an object of DrawingAPITwo in its 4rth argument
circle2 = Circle(1, 3, 3, DrawingAPITwo())
# Draw it using API Two
circle2.draw()

See also:

Buffer this pageShare on FacebookPrint this pageTweet about this on TwitterShare on Google+Share on LinkedInShare on StumbleUpon

Leave a Reply