A A
[Design Pattern] Visitor Pattern - ๋ฐฉ๋ฌธ์ž ํŒจํ„ด

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๋ฅผ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.

 

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” ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.