Visitor Pattern
Visitor Pattern์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ฒ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๋ ํจํด์ ๋๋ค.
- ๋ฐ์ดํฐ ๊ตฌ์กฐ ์์ ๋ง์ ์์๊ฐ ์ ์ฅ๋์ด ์๊ณ , ๊ทธ ๊ฐ ์์์ ๋ฐํ์ฌ ๋ฌด์์ธ๊ฐ ์ฒ๋ฆฌํด ๋๊ฐ๋ค๊ณ ํ ๋, ์ด๋ ๊ทธ ์ฒ๋ฆฌ์ ์ฝ๋๋ ์ด๋์ ์จ์ผ ํ ์ง ๊ณ ๋ฏผ์ด ๋ฉ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์๊ฐํ๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ์ํ๊ณ ์๋ ํด๋์ค ์์ ๊ธฐ์ ํด์ผ ํฉ๋๋ค.
- ํ์ง๋ง, ๋ง์ฝ ๊ทธ ์ฒ๋ฆฌ๊ฐ ์ฌ๋ฌ ์ข ๋ฅ๋ผ๋ฉด ์๋ก์ด ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋๋ง๋ค ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํด๋์ค๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
์์๋ค์ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก์ด ์์ ์ ์ถ๊ฐํ ์ ์๊ฒ ํด์ฃผ๋ ๋์์ธ ํจํด์ ๋๋ค.
๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์๋ก์ด ์์ ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋๋ก ํฉ๋๋ค.
- Visitor ํจํด์ ๊ฐ์ฒด์ ๊ตฌ์กฐ๊ฐ ์์ ์ ์ด์ง๋ง ๊ฐ์ฒด์ ์ํํ ์์ ์ ์์ฃผ ๋ฐ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ฉด ์ ์ฉํฉ๋๋ค.
- ๊ฐ์ฒด ๊ตฌ์กฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ๊ฒฝ์ฐ: ๊ฐ์ฒด๊ตฌ์กฐ, ์ฆ ์ํ ๋ณ์๋ค์ ๋ณํ๊ฐ ์ ์ ๋.
- ๊ฐ์ฒด ๊ตฌ์กฐ์ ์ฌ๋ฌ ๋ค๋ฅธ ์ฐ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ: ๊ฐ ์ฐ์ฐ์ ๊ฐ์ฒด์ ์ถ๊ฐํ๋ ๋์ Visitor ํจํด์ ์ฌ์ฉํ๋ฉด ๊ฐ ์ฐ์ฐ์ ๋ณ๋์ Visitor ํด๋์ค๋ก ์บก์ํ ํ ์ ์์ต๋๋ค.
- ๋ค์ํ ์ฐ์ฐ์ด ๊ฐ์ฒด์ ํ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ฒฝ์ฐ: Visitor ํจํด์ ์ฌ์ฉํ๋ฉด ๊ฐ ํ์ ์ ๋ง๋ ์ฐ์ฐ์ ์ฝ๊ฒ ์ ์ํ ์ ์์ต๋๋ค.
- ํด๋์ค๊ฐ ๋ง๊ณ ์ฐ์ฐ์ด ๋ง์์ง ๋: ํด๋์ค์ ์๊ฐ ๋ง๊ณ ๊ทธ ํด๋์ค๋ค์ ๋ํด ์ํํด์ผ ํ๋ ์ฐ์ฐ์ด ๋ง์์ง ๋, ๊ฐ ํด๋์ค์ ์ฐ์ฐ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ ์ง๋ณด์์ ํ์ฅ์ฑ ์ธก๋ฉด์์, Visitor ํจํด์ ์ฌ์ฉํ๋ฉด ์ฐ์ฐ์ ๋ ๋ฆฝ์ ์ธ ํด๋์ค๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- Element: ์์ ์ ๋ฐ์๋ค์ด๋ ๊ฐ์ฒด ๊ตฌ์กฐ์ ๊ตฌ์ฑ ์์์ด๋ฉฐ, ๊ฐ ์์ ํด๋์ค๋ accept() ๋ฉ์๋๋ฅผ ๊ตฌํํฉ๋๋ค.
- Visitor: ๊ฐ์ฒด ๊ตฌ์กฐ์ ์์๋ค์ ๋ํด ์ํํ ์์ ์ ์ ์ํ๋ API์ด๋ฉฐ, ๊ฐ ์์ ํ์ ๋ณ๋ก ๋ฐฉ๋ฌธ ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
- Concrete Element: ์ค์ ๊ฐ์ฒด ๊ตฌ์กฐ์ ์์๋ก, accept ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ๋ฐฉ๋ฌธ์๋ฅผ ๋ฐ์๋ค์ ๋๋ค.
- Concrete Visitor: Visitor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ๊ฐ ์์์ ๋ํด ํน์ ์์ ์ ์ํํฉ๋๋ค.
์๊ณ ๋ฆฌ์ฆ์ Object Structure๋ก ๋ถํฐ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ๊ธฐ์กด์๋ Object ๋ด๋ถ์์ Algorithm์ ์ํํฉ๋๋ค.
- Visitor Pattern์ ์ด Object๋ฅผ ๋ค๋ฃจ๋ Algorithm์ ๋ถ๋ฆฌํฉ๋๋ค.
์ด๋ฏธ ์กด์ฌํ๋ ํด๋์ค๋ Object ์์ ์์ด ์๋ก์ด Algorithm์ ๊ธฐ์กด Object์ ์ ์ฉ ๊ฐ๋ฅ ํฉ๋๋ค.
Visitor Pattern Example
- ๋ด๋ถ ๊ตฌ์กฐ์ธ name, age๋ฅผ ์ถ๋ ฅํ๋ ํจ์๋ ์์ต๋๋ค. (Algorithm์ด ์์ต๋๋ค)
- ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด ์๋ก์ด ํจ์ ์ ์ํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง Cat class๋ฅผ ์์ ํ์ง ์๋ ์ํ๋ก ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด Visitor Pattern์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Visitor Pattern ์ฝ๋ ๊ตฌ์กฐ
Cat class
- Speak(): "meow"๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- Accept(): visitor๋ฅผ ๋ฐ์๋ค์ด๋ ํจ์์ ๋๋ค.
- Attributes: name, age
Visitor class
- Visit()
NameVisitor class
- Visitor class ์ ์์๋ฐ์ต๋๋ค.
- Visit(): name์ ์ถ๋ ฅํ๋ ํจ์์ ๋๋ค.
AgeVisitor class
- Visitor class ์ ์์๋ฐ์ต๋๋ค.
- Visit(): age๋ฅผ ์ถ๋ ฅํ๋ ํจ์์ ๋๋ค.
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
print("meow")
def accept(self, visitor: Visitor):
print("use implementation of visitor")
visitor.visit(self)
- Cat class
- init
- ๋ด๋ถ ๊ตฌ์กฐ๋ก name, age๊ฐ ์กด์ฌํฉ๋๋ค.
- Speak()
- "meow"๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
- Accept()
- Visitor๋ฅผ ์๋ฝํ๋ ํจ์์ ๋๋ค.
- Argument๋ก ๋ฐ์ visitor์ visitํจ์๋ฅผ ํธ์ถํ๊ณ ๊ทธ argument๋ก ์์ ์ธ self๋ฅผ ๋๊ฒจ์ค๋๋ค.
- init
kitty = Cat("kitty", 3)
kitty.speak()
- name: ‘kitty’, age: 3์ธ Cat object๋ฅผ ์์ฑํฉ๋๋ค.
- kitty์ speak() ํธ์ถํ๋ฉด “meow”๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
name_visitor = NameVisitor()
kitty.accept(name_visitor)
- name ์ถ๋ ฅํด์ฃผ๋ Namevisitor object์ธ name_visitor ๋ฅผ ์์ฑํฉ๋๋ค.
- kitty์ accept ํจ์์ ์ธ์๋ก name_visitor ๋ฅผ ๋๊ฒจ์ค๋๋ค.
- kitty name์ธ “kitty” ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
age_visitor = AgeVisitor()
kitty.accept(age_visitor)
- age ์ถ๋ ฅํด์ฃผ๋ Agevisitor object์ธ age_visitor ๋ฅผ ์์ฑํฉ๋๋ค.
- kitty์ accept ํจ์์ ์ธ์๋ก age_visitor ๋ฅผ ๋๊ฒจ์ค๋๋ค.
- kitty age์ธ “3” ์ ์ถ๋ ฅํฉ๋๋ค.
'๐บ๏ธ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] State Pattern - ์ํ ํจํด (0) | 2024.07.10 |
---|---|
[Design Pattern] Mediator Pattern - ๋งค๋์์ดํฐ ํจํด (0) | 2024.06.10 |
[Design Pattern] Observer Pattern - ์ต์ ๋ฒ ํจํด (0) | 2024.06.09 |
[Design Pattern] Memento Pattern - ๋ฉ๋ฉํ ํจํด (0) | 2024.06.09 |
[Design Pattern] Chain of Responsibility (0) | 2024.06.09 |