이러한 23개의 패턴이 디자인 패턴의 거의 전부이다.
디자인 패턴에는 SOLID라는 5개의 객체 지향 설계 원칙이 존재한다.
현재 디자인 패턴을 공부하면서 알게된 내용을 정리하려한다.
def add(num1, num2):
return num1 + num2
def numPrint(num):
print(num)
이 코드의 경우 SRP 원칙을 잘 따른 코드이다.
def addPrint(num1, num2):
num = num1 + num2
print(num)
return num
이 코드는 SRP 원칙을 따르지 않은 코드이다.
class Animal:
def __init__(self, a_type):
self.a_type = a_type
def hey(animal:Animal):
if animal.a_type == "Cat":
print("meow")
elif animal.a_type == "Dog":
print("bark")
else:
raise Error("Wrong a type")
# Cow, Sheep
kitty = Animal("Cat")
bingo = Animal("Dog")
cow = Animal("Cow")
sheep = Animal("Sheep")
hey(cow)
hey(sheep)
기능이 추가될 때마다 수정한 코드
class Animal:
def speak(self):
pass
class Cat(Animal):
def speak(self):
print("meow")
class Dog(Animal):
def speak(self):
print("bark")
class Sheep(Animal):
def speak(self):
print("meh")
class Cow(Animal):
def speak(self):
print("moo")
def hey(animal:Animal):
animal.speak()
cow = Cow()
sheep = Sheep()
hey(cow)
hey(sheep)
기능이 추가되어도 수정이 필요하지 않은 코드
class Cat(Animal):
def speak(self):
print("meow")
class Dog(Animal):
def speak(self):
print("bark")
class Zoo:
def __init__(self):
self.cat = Cat()
self.dog = Dog()
이 코드에서 동물을 추가할 시
class Cat:
def speak(self):
print("meow")
class Dog:
def speak(self):
print("bark")
class Sheep:
def speak(self):
pass
class Cow:
def speak(self):
pass
class Zoo:
def __init__(self):
self.cat = Cat()
self.dog = Dog()
self.sheep = Sheep()
slef.cow = Cow()
class Animal:
def speak(self):
pass
class Cat(Animal):
def speak(self):
print("meow")
class Dog(Animal):
def speak(self):
print("bark")
class Zoo:
def __init__(self):
self.animals = []
def addAnimal(self, animal:Animal):
self.animals.append(animal)
def speakAll(self):
for animal in self.animals:
animal.speak()
상위 -> 하위에서 의존성을 가지고 있던 것을
하위 -> 상위로 의존성을 역전시킴(의존성을 떨어뜨림)
class Cat: # Cat 클래스(상위클래스)
def speak(self):
print("meow")
class BlackCat(Cat): # BlackCat 클래스(Cat의 하위 클래스)
def speak(self):
print("black meow")
def speak(cat:Cat): # Cat 타입에 맞는 함수가 있음
cat.speak()
cat = Cat()
speak(cat) # meow
cat = BlackCat()
speak(cat) # black meow
class Fish(Cat): # Fish 클래스 (Cat의 하위 클래스)
def speak(self):
raise Exception("Fish cannot speak")
Cat = Fish() # Error(상위 클래스의 타입으로 대체 x)
speak(cat)