Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Multicolored Lamp by MarcAureleCoste
import abc
class Context(object):
def __init__(self):
self._states = {
'state_green': {
'state_obj': ColorGreenState(), 'next': 'state_red'
},
'state_red': {
'state_obj': ColorRedState(), 'next': 'state_blue'
},
'state_blue': {
'state_obj': ColorBlueState(), 'next': 'state_yellow'
},
'state_yellow': {
'state_obj': ColoryellowState(), 'next': 'state_green'
}
}
self._current_state = 'state_green'
@property
def current_state(self):
return self._states[self._current_state]['state_obj']
def next_state(self):
self._current_state = self._states[self._current_state]['next']
class AbstractState(metaclass=abc.ABCMeta):
@abc.abstractmethod
def light(self):
pass
class ColorGreenState(object):
def light(self):
return 'Green'
class ColorRedState(object):
def light(self):
return 'Red'
class ColorBlueState(object):
def light(self):
return 'Blue'
class ColoryellowState(object):
def light(self):
return 'Yellow'
class Lamp:
def __init__(self):
self._on = False
self._context = Context()
def light(self):
if not self._on:
self._on = True
else:
self._context.next_state()
return self._context.current_state.light()
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
lamp_1 = Lamp()
lamp_2 = Lamp()
lamp_1.light() #Green
lamp_1.light() #Red
lamp_2.light() #Green
assert lamp_1.light() == "Blue"
assert lamp_1.light() == "Yellow"
assert lamp_1.light() == "Green"
assert lamp_2.light() == "Red"
assert lamp_2.light() == "Blue"
print("Coding complete? Let's try tests!")
Aug. 6, 2018
Comments: