Implemented bridge design pattern.
This commit is contained in:
15
pypatterns/structural/bridge.py
Normal file
15
pypatterns/structural/bridge.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from abc import ABCMeta
|
||||
|
||||
|
||||
class Bridge(object, metaclass=ABCMeta):
|
||||
"""
|
||||
Base Bridge class as part of the Bridge design pattern.
|
||||
"""
|
||||
def __init__(self, implementor):
|
||||
"""
|
||||
Initialize a new Bridge instance.
|
||||
|
||||
@param implementor: The implementor that concrete classes should call upon to do some action.
|
||||
"""
|
||||
self.implementor = implementor
|
||||
|
||||
93
tests/structural_tests/test_bridge.py
Normal file
93
tests/structural_tests/test_bridge.py
Normal file
@@ -0,0 +1,93 @@
|
||||
from unittest import TestCase
|
||||
from pypatterns.structural.bridge import Bridge
|
||||
|
||||
|
||||
class BridgeTestCase(TestCase):
|
||||
"""
|
||||
Unit testing class for the Bridge class.
|
||||
"""
|
||||
def setUp(self):
|
||||
"""
|
||||
Initialize testing data.
|
||||
"""
|
||||
class DrawingAPI(object):
|
||||
|
||||
def __init__(self): pass
|
||||
|
||||
def draw_circle(self): pass
|
||||
|
||||
def draw_rectangle(self): pass
|
||||
|
||||
class DrawingAPI1(DrawingAPI):
|
||||
|
||||
def draw_circle(self):
|
||||
return 'draw circle 1'
|
||||
|
||||
def draw_rectangle(self):
|
||||
return 'draw rectangle 1'
|
||||
|
||||
class DrawingAPI2(DrawingAPI):
|
||||
|
||||
def draw_circle(self):
|
||||
return 'draw circle 2'
|
||||
|
||||
def draw_rectangle(self):
|
||||
return 'draw rectangle 2'
|
||||
|
||||
class Shape(Bridge):
|
||||
|
||||
def draw(self): pass
|
||||
|
||||
def do_something_high_level(self): pass
|
||||
|
||||
class CircleShape(Shape):
|
||||
|
||||
def draw(self):
|
||||
return self.implementor.draw_circle()
|
||||
|
||||
def do_something_high_level(self):
|
||||
return 'high level circle'
|
||||
|
||||
class RectangleShape(Shape):
|
||||
|
||||
def draw(self):
|
||||
return self.implementor.draw_rectangle()
|
||||
|
||||
def do_something_high_level(self):
|
||||
return 'high level rectangle'
|
||||
|
||||
self.drawing_api_one = DrawingAPI1()
|
||||
self.drawing_api_two = DrawingAPI2()
|
||||
|
||||
self.circle_shape_one = CircleShape(self.drawing_api_one)
|
||||
self.circle_shape_two = CircleShape(self.drawing_api_two)
|
||||
|
||||
self.rectangle_shape_one = RectangleShape(self.drawing_api_one)
|
||||
self.rectangle_shape_two = RectangleShape(self.drawing_api_two)
|
||||
|
||||
def test_init(self):
|
||||
"""
|
||||
Test the __init__ method.
|
||||
|
||||
@raise AssertionError: If the test fails.
|
||||
"""
|
||||
self.assertEquals(self.drawing_api_one, self.circle_shape_one.implementor)
|
||||
self.assertEquals(self.drawing_api_two, self.circle_shape_two.implementor)
|
||||
self.assertEquals(self.drawing_api_one, self.rectangle_shape_one.implementor)
|
||||
self.assertEquals(self.drawing_api_two, self.rectangle_shape_two.implementor)
|
||||
|
||||
def test_implementation(self):
|
||||
"""
|
||||
Test an implementation of the bridge pattern
|
||||
|
||||
@raise AssertionError: If the test fails.
|
||||
"""
|
||||
self.assertEquals('draw circle 1', self.circle_shape_one.draw())
|
||||
self.assertEquals('draw circle 2', self.circle_shape_two.draw())
|
||||
self.assertEquals('draw rectangle 1', self.rectangle_shape_one.draw())
|
||||
self.assertEquals('draw rectangle 2', self.rectangle_shape_two.draw())
|
||||
|
||||
self.assertEquals('high level circle', self.circle_shape_one.do_something_high_level())
|
||||
self.assertEquals('high level circle', self.circle_shape_two.do_something_high_level())
|
||||
self.assertEquals('high level rectangle', self.rectangle_shape_one.do_something_high_level())
|
||||
self.assertEquals('high level rectangle', self.rectangle_shape_two.do_something_high_level())
|
||||
Reference in New Issue
Block a user