μΉ΄ν
κ³ λ¦¬ μμ
[OOP] Decorator Pattern
loki d
2021. 9. 4. 22:44
728x90
μ₯μ ν¨ν΄
ν¨ν΄μ λͺ©μ : This pattern attaches additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality. β GoF β
ν¨ν΄μ μ¬μ©
- μμμ μν μ μ½μ¬νμ ꡬμ λ°μ§ μκ³ λμ μΌλ‘ κ°μ²΄μ μλ‘μ΄ μ± μ(νμ, μν)μ μΆκ°νκ³ μΆμ κ²½μ° (λ€λ₯Έ λμΌ νμ κ°μ²΄λ€μκ² μν₯μ μ£Όμ§ μκ³ )
- μμ€ν μ΄ λμνλ©΄μ κ°μ²΄μ κΈ°λ₯μ μΆκ°νκ³ μ κ±°νκ³ μΆμ κ²½μ°
- λμ μΌλ‘ κ°μ²΄μ μΆκ°ν μ μλ μλ‘ λ 립μ μΈ λ€μν κΈ°λ₯μ΄ μ‘΄μ¬ν λ
- μμμ ν΅ν΄ κ°μ²΄μ μ± μμ νμ₯νκΈ° μ΄λ €μΈ κ²½μ°
ν¨ν΄ μ μ© κ°λ₯ μλ리μ€
- μ1) GUIμμ μλμ° μ₯μ (μ€ν¬λ‘€λ°κ° μλ μλμ°)
- μ2) νμΌ μ²λ¦¬μμ κΈ°λ³Έ μ²λ¦¬λ₯Ό μ₯μνμ¬ λ²νΌλ§ μ§μ, μμΆ, μνΈν λ±μ μ§μνλλ‘ λ§λ€ μ. μμ
ν¨ν΄μ μ°Έμ¬μ
- μ₯μ λμ μΆμ ν΄λμ€ λλ interface: λͺ¨λ μ₯μ λμμμ΄ κ°μΆμ΄μΌ νλ μ± μ μ μ
- μ₯μ λμ ν΄λμ€ : μ₯μ λμμ μ₯μμλ€μ μ‘΄μ¬λ₯Ό μΈμν νμκ° μμ
- μ₯μμ μΆμ ν΄λμ€ : κΌ νμνμ§ μμ μ μμ. ꡬ체μ μ₯μμ₯ ν΄λμ€κ° λ°λμ μ¬μ μν΄μΌ νλ λ©μ λλ₯Ό μ μνλλ° μ μ©νκ³ , μ₯μ© μμ μ₯μ λμμ ꡬλΆν μ μλ νμ μΌλ‘ νμ© κ°λ₯ν¨
- ꡬ체μ μ₯μμ₯ ν΄λμ€: μ₯μ λμμ μΆκ°ν μ± μμ΄ μ μλμ΄ μμ. μ₯μ λμμ λ©€λ² λ³μ(has-a)λ‘ μ μ§νλ©°, μ΄ λμμ μ΄λ―Έ λ€λ₯Έ μ₯μμ₯μ μν΄ μ₯μλμ΄ μμ μ μμ. μ₯μ λμμ ꡬ체μ μ₯μμ₯ ν΄λμ€ λμ μ μ₯μμ₯ μΆμ ν΄λμ€μμ μ μ§ν μ μμ. μ₯μλ κ°μ²΄λ μ₯μ λμμ΄ μ¬μ©λ μ μλ λͺ¨λ κ³³μμ μ¬μ©λ μ μμ΄μΌ ν¨
ν¨ν΄μ ꡬ쑰
μ°Έμ¬μκ° νλ ₯
- μ₯μμ κ°μ²΄λ μ₯μ λμμ ν¬ν¨ κ΄κ³λ₯Ό μ μ§νλ©°, μ₯μμ κ°μ²΄λ μ₯μν κ°μ₯ λ°κΉ₯ κ°μ²΄νκ³ λ§ μν΅ν¨. λ³΄ν΅ μ΄λ€ νμμ λν μꡬλ₯Ό λ°μΌλ©΄ ν΄λΉ μꡬλ₯Ό κ°μ₯ λ°κΉ₯ κ°μ²΄μκ² μ λ¬νλ©°, μ΄ κ³Όμ μ΄ κ°μ₯ μμͺ½ κ°μ²΄(μ₯μ λμ)κΉμ§ μ λ¬λμ΄ μ΅μ’ μ± μμ μνμ΄ μμ±λλ ννμ. μ΄λ μꡬλ₯Ό μ λ¬νκΈ° μ μ μ₯μ μλ§μ λ νΉν κΈ°λ₯μ μννκ±°λ μꡬλ₯Ό μ λ¬νκ³ κ·Έ κ²°κ³Όλ₯Ό λ°μΌλ©΄ μΆκ°μ μΈ κΈ°λ₯μ μννμ¬ μ΅μ’ κ²°κ³Όλ₯Ό μμ±νλ ννμ
class Beverage():
def __init__(self, description="μ΄λ¦ μλ μλ£"):
self.description = description
def getDescription(self):
return self.description
@abstractmethod
def cost(self):
pass
class CondimentDecorator(Beverage):
@abstractmethod
def getDescription(self):
pass
class DarkRoast(Beverage):
def __init__(self):
Beverage.__init__(self, "DarkRoast")
def cost(self):
return 2100
class Mocha(CondimentDecorator):
def __init__(self, beverage):
if not isinstance(beverage, Beverage):
raise TypeError("must use Beverage")
self.beverage = beverage
def getDescription(self):
return self.beverage.getDescription()+ ", Mocha"
def cost(self):
return self.beverage.cost()+200
beverage = DarkRoast()
beverage = Mocha(beverage)
beverage = Mocha(beverage)
print(beverage.getDescription())
print(beverage.cost())