-
Notifications
You must be signed in to change notification settings - Fork 0
/
09.bridge.py
143 lines (97 loc) · 3.53 KB
/
09.bridge.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# -*- coding: utf-8 -*-
""" 구조(Structural) 패턴
https://lktprogrammer.tistory.com/35
https://m.blog.naver.com/PostView.nhn?blogId=tradlinx0522&logNo=220928963011&proxyReferer=https:%2F%2Fwww.google.com%2F
브릿지 패턴
- 구현 클래스 계층과 기능 클래스 계층을 연결하는 패턴
- 기능의 구현을 상속이 아닌 위임을 사용(느슨한 연결)
장점
구현부에서 추상(기능)층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 합니다.
즉 기능과 구현에 대해서 두 개를 별도의 클래스로 구현을 합니다.
구성
+ 기능 클래스
- Abstraction : 최상위 기능 클래스
- RefindAbstraction : 하위 기능 클래스 (Abstraction에서 새로운 부분을 "확장"한 클래스)
+ 구현 클래스
- Implementor : 최상위 구현 클래스 (Abstraction의 기능을 구현하기 위한 인터페이스 정의)
- ConcreteImplementor : 하위 구현 클래스 (실제 기능을 구현합니다.)
Strategy 패턴과의 차이점
- Strategy 패턴은 행동(Behavioral) 패턴
+ 런타임에 사용자가 알맞는 알고리즘(전략)을 선택
- Bridge 패턴은 구조(Structural) 패턴
+ 인터페이스 계층 구조를 나누고 참조를 통해 합치는 형태
"""
from abc import ABC, abstractmethod
""" Abstraction
기능 계층의 최상위 클래스.
구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현부분의 메서드를 호출합니다.
"""
class Animal:
def __init__(self, hunt_impl):
self.hunt_impl = hunt_impl
def find_quarry(self):
self.hunt_impl.find_quarry()
def detect_quarry(self):
self.hunt_impl.detect_quarry()
def attack_quarry(self):
self.hunt_impl.attack_quarry()
def hunt(self):
self.find_quarry()
self.detect_quarry()
self.attack_quarry()
""" RefindAbstraction
기능 계층에서 새로운 부분을 확장한 추상 클래스 (구현x 확장!)
"""
class SoundAnimal(ABC, Animal):
@abstractmethod
def make_sound(self):
pass
"""Implementor
Abstraction의 기능을 구현하기 위한 인터페이스 정의
"""
class HuntImpl(ABC):
@abstractmethod
def find_quarry(self):
pass
@abstractmethod
def detect_quarry(self):
pass
@abstractmethod
def attack_quarry(self):
pass
"""ConcreteImplementor
실제 기능을 구현합니다. """
class AiroHuntImpl(HuntImpl):
def find_quarry(self):
print("하늘로 날아간다")
def detect_quarry(self):
print("공중에서 먹이를 발견")
def attack_quarry(self):
print("하강하여 먹이를 사냥한다")
class AquaHuntImpl(HuntImpl):
def find_quarry(self):
print("물 속을 탐색한다")
def detect_quarry(self):
print("물 속에서 먹이를 발견한다")
def attack_quarry(self):
print("먹잇감을 사냥한다")
# animals
class Shark(Animal):
def hunt(self):
print("상어의 사냥 방식")
return super().hunt()
class Eagle(SoundAnimal):
def hunt(self):
print("매의 사냥 방식")
return super().hunt()
def make_sound(self):
print("scream!!")
if __name__ == "__main__":
aqua_hunt_impl = AquaHuntImpl()
airo_hunt_impl = AiroHuntImpl()
shark = Shark(hunt_impl=aqua_hunt_impl)
eagle = Eagle(hunt_impl=airo_hunt_impl)
shark.hunt()
print("=" * 50)
eagle.hunt()
eagle.make_sound()