Python
""
# -
class RedCircle:
def draw(self):
print("")
class BlueCircle:
def draw(self):
print("")
class RedRectangle:
def draw(self):
print("")
class BlueRectangle:
def draw(self):
print("")
#
# 3 3 = 9
class RedCircle:
def draw(self):
print("")
class BlueCircle:
def draw(self):
print("")
class RedRectangle:
def draw(self):
print("")
class BlueRectangle:
def draw(self):
print("")
#
# 3 3 = 9
#
class Color:
""" - """
def apply_color(self):
pass
class Shape:
""" - """
def __init__(self, color):
self.color = color #
def draw(self):
pass
# 3 + 3 = 6
# 3 3 = 9
class Color:
""" - """
def apply_color(self):
pass
class Shape:
""" - """
def __init__(self, color):
self.color = color #
def draw(self):
pass
# 3 + 3 = 6
# 3 3 = 9
- Abstraction
- RefinedAbstraction
- Implementor
- ConcreteImplementor
1
from abc import ABC, abstractmethod
class Color(ABC):
""" - """
@abstractmethod
def apply_color(self):
pass
class Red(Color):
""" - """
def apply_color(self):
return ""
class Blue(Color):
""" - """
def apply_color(self):
return ""
class Green(Color):
""" - """
def apply_color(self):
return ""
class Color(ABC):
""" - """
@abstractmethod
def apply_color(self):
pass
class Red(Color):
""" - """
def apply_color(self):
return ""
class Blue(Color):
""" - """
def apply_color(self):
return ""
class Green(Color):
""" - """
def apply_color(self):
return ""
2
class Shape(ABC):
""" - """
def __init__(self, color: Color):
self.color = color #
@abstractmethod
def draw(self):
pass
class Circle(Shape):
""" - """
def draw(self):
color_name = self.color.apply_color()
print(f"{color_name}")
class Rectangle(Shape):
""" - """
def draw(self):
color_name = self.color.apply_color()
print(f"{color_name}")
class Triangle(Shape):
""" - """
def draw(self):
color_name = self.color.apply_color()
print(f"{color_name}")
""" - """
def __init__(self, color: Color):
self.color = color #
@abstractmethod
def draw(self):
pass
class Circle(Shape):
""" - """
def draw(self):
color_name = self.color.apply_color()
print(f"{color_name}")
class Rectangle(Shape):
""" - """
def draw(self):
color_name = self.color.apply_color()
print(f"{color_name}")
class Triangle(Shape):
""" - """
def draw(self):
color_name = self.color.apply_color()
print(f"{color_name}")
3
#
def main():
#
red = Red()
blue = Blue()
green = Green()
#
red_circle = Circle(red)
blue_rectangle = Rectangle(blue)
green_triangle = Triangle(green)
#
print("=== ===")
red_circle.draw() #
blue_rectangle.draw() #
green_triangle.draw() #
#
red_rectangle = Rectangle(red)
red_rectangle.draw() #
if __name__ == "__main__":
main()
def main():
#
red = Red()
blue = Blue()
green = Green()
#
red_circle = Circle(red)
blue_rectangle = Rectangle(blue)
green_triangle = Triangle(green)
#
print("=== ===")
red_circle.draw() #
blue_rectangle.draw() #
green_triangle.draw() #
#
red_rectangle = Rectangle(red)
red_rectangle.draw() #
if __name__ == "__main__":
main()
1
from abc import ABC, abstractmethod
#
class MessageSender(ABC):
@abstractmethod
def send(self, message):
pass
class EmailSender(MessageSender):
def send(self, message):
return f"{message}"
class SMSSender(MessageSender):
def send(self, message):
return f"{message}"
class WeChatSender(MessageSender):
def send(self, message):
return f"{message}"
#
class Message(ABC):
def __init__(self, sender: MessageSender):
self.sender = sender
@abstractmethod
def send(self):
pass
class UrgentMessage(Message):
def send(self):
message = "[] " + self.get_content()
return self.sender.send(message)
def get_content(self):
return ""
class NormalMessage(Message):
def __init__(self, sender: MessageSender, content):
super().__init__(sender)
self.content = content
def send(self):
return self.sender.send(self.content)
#
def message_example():
email_sender = EmailSender()
sms_sender = SMSSender()
#
urgent_sms = UrgentMessage(sms_sender)
print(urgent_sms.send()) # []
#
normal_email = NormalMessage(email_sender, "")
print(normal_email.send()) #
message_example()
#
class MessageSender(ABC):
@abstractmethod
def send(self, message):
pass
class EmailSender(MessageSender):
def send(self, message):
return f"{message}"
class SMSSender(MessageSender):
def send(self, message):
return f"{message}"
class WeChatSender(MessageSender):
def send(self, message):
return f"{message}"
#
class Message(ABC):
def __init__(self, sender: MessageSender):
self.sender = sender
@abstractmethod
def send(self):
pass
class UrgentMessage(Message):
def send(self):
message = "[] " + self.get_content()
return self.sender.send(message)
def get_content(self):
return ""
class NormalMessage(Message):
def __init__(self, sender: MessageSender, content):
super().__init__(sender)
self.content = content
def send(self):
return self.sender.send(self.content)
#
def message_example():
email_sender = EmailSender()
sms_sender = SMSSender()
#
urgent_sms = UrgentMessage(sms_sender)
print(urgent_sms.send()) # []
#
normal_email = NormalMessage(email_sender, "")
print(normal_email.send()) #
message_example()
2
#
class Device(ABC):
@abstractmethod
def turn_on(self):
pass
@abstractmethod
def turn_off(self):
pass
@abstractmethod
def set_volume(self, volume):
pass
class TV(Device):
def turn_on(self):
return ""
def turn_off(self):
return ""
def set_volume(self, volume):
return f"{volume}"
class Radio(Device):
def turn_on(self):
return ""
def turn_off(self):
return ""
def set_volume(self, volume):
return f"{volume}"
#
class RemoteControl:
def __init__(self, device: Device):
self.device = device
def toggle_power(self):
return ""
def volume_up(self):
return ""
def volume_down(self):
return ""
class AdvancedRemoteControl(RemoteControl):
def mute(self):
return ""
def set_channel(self, channel):
return f"{channel}"
#
def remote_example():
tv = TV()
radio = Radio()
basic_remote = RemoteControl(tv)
advanced_remote = AdvancedRemoteControl(radio)
print(basic_remote.toggle_power()) #
print(advanced_remote.mute()) #
remote_example()
class Device(ABC):
@abstractmethod
def turn_on(self):
pass
@abstractmethod
def turn_off(self):
pass
@abstractmethod
def set_volume(self, volume):
pass
class TV(Device):
def turn_on(self):
return ""
def turn_off(self):
return ""
def set_volume(self, volume):
return f"{volume}"
class Radio(Device):
def turn_on(self):
return ""
def turn_off(self):
return ""
def set_volume(self, volume):
return f"{volume}"
#
class RemoteControl:
def __init__(self, device: Device):
self.device = device
def toggle_power(self):
return ""
def volume_up(self):
return ""
def volume_down(self):
return ""
class AdvancedRemoteControl(RemoteControl):
def mute(self):
return ""
def set_channel(self, channel):
return f"{channel}"
#
def remote_example():
tv = TV()
radio = Radio()
basic_remote = RemoteControl(tv)
advanced_remote = AdvancedRemoteControl(radio)
print(basic_remote.toggle_power()) #
print(advanced_remote.mute()) #
remote_example()
✅
- between abstraction and implementation
❌
#
class BadShape:
def __init__(self, color_type):
if color_type == "red":
self.color = Red()
elif color_type == "blue":
self.color = Blue()
#
#
class GoodShape:
def __init__(self, color: Color): #
self.color = color
class BadShape:
def __init__(self, color_type):
if color_type == "red":
self.color = Red()
elif color_type == "blue":
self.color = Blue()
#
#
class GoodShape:
def __init__(self, color: Color): #
self.color = color
1
2