๋ฐฉ๋ฌธ์ ํจํด (Visitor Pattern)
๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์๋ก์ด ๋์์ ์ถ๊ฐํ ์ ์๊ฒ ํด์ฃผ๋ ํ์ ํจํด์
๋๋ค. ๋ฐฉ๋ฌธ์ ํด๋์ค๋ฅผ ํตํด ๊ธฐ์กด ํด๋์ค์ ์์ ์์ด ์๋ก์ด ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ผ๋ฉฐ, ๊ด๋ จ ๋์์ ํ ๊ณณ์ ๋ชจ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ฃผ์ ๋ชฉ์
โข
๊ฐ์ฒด ๊ตฌ์กฐ์ ์ฒ๋ฆฌ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ ์ฐ์ฑ ํ๋ณด
โข
๊ธฐ์กด ์ฝ๋ ์์ ์์ด ์๋ก์ด ๋์ ์ถ๊ฐ ๊ฐ๋ฅ
โข
๊ด๋ จ ๋์์ ํ ๊ณณ์์ ๊ด๋ฆฌํ์ฌ ์ ์ง๋ณด์์ฑ ํฅ์
ํน์ง
โข
Double Dispatch๋ฅผ ํ์ฉํ์ฌ ์คํ ์์ ์ ์ ์ ํ ๋ฉ์๋ ํธ์ถ
โข
๊ฐ์ฒด ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ถ๋ฆฌํ์ฌ ๋จ์ผ ์ฑ
์ ์์น ์ค์
โข
์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ ์ Visitor ํด๋์ค๋ง ์ถ๊ฐํ๋ฉด ๋จ
๊ตฌ์ฑ์์
โข
Visitor: visit() ๋ฉ์๋๋ฅผ ํตํด ๊ฐ ์์์ ๋ํด ๋ฐฉ๋ฌธํ ์์
์ ์ ์ํ๋ ์ธํฐํ์ด์ค์
๋๋ค.
โข
ConcreteVisitor: Visitor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์
๋๋ค. ๊ฐ ๊ฐ์ฒด ํ์
์ ๋ํด ๊ตฌ์ฒด์ ์ธ ์์
์ ์ํํฉ๋๋ค.
โข
Element: ๋ฐฉ๋ฌธ์ ๋ฐ๋ ๊ฐ์ฒด๋ค์ ๋ํ๋ด๋ ์ธํฐํ์ด์ค์
๋๋ค. accept() ๋ฉ์๋๋ฅผ ํตํด ๋ฐฉ๋ฌธ์๋ฅผ ๋ฐ์ต๋๋ค.
โข
ConcreteElement: Element ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค์
๋๋ค. accept() ๋ฉ์๋๋ฅผ ํตํด ๋ฐฉ๋ฌธ์๋ฅผ ์๋ฝํฉ๋๋ค.
โข
ObjectStructure: ์ฌ๋ฌ ๊ฐ์ Element ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ ํด๋์ค์
๋๋ค. ๊ฐ ๊ฐ์ฒด์ ๋ํด ๋ฐฉ๋ฌธ์๋ฅผ ์ํ์ํฌ ์ ์๋๋ก ํฉ๋๋ค.
์์ ์ฝ๋
// Element ์ธํฐํ์ด์ค
interface Shape {
void accept(ShapeVisitor visitor);
}
// Concrete Elements
class Circle implements Shape {
public void accept(ShapeVisitor visitor) {
visitor.visit(this);
}
}
class Rectangle implements Shape {
public void accept(ShapeVisitor visitor) {
visitor.visit(this);
}
}
// Visitor ์ธํฐํ์ด์ค
interface ShapeVisitor {
void visit(Circle circle);
void visit(Rectangle rectangle);
}
// Concrete Visitor
class AreaCalculator implements ShapeVisitor {
public void visit(Circle circle) {
System.out.println("์์ ๋์ด ๊ณ์ฐ");
}
public void visit(Rectangle rectangle) {
System.out.println("์ฌ๊ฐํ์ ๋์ด ๊ณ์ฐ");
}
}
Java
๋ณต์ฌ
์ฝ๋ ์ค๋ช
์ ์์ ์ฝ๋๋ ๋ํ์ ๋์ด๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฌธ์ ํจํด์ ๊ตฌํํ ๊ฒ์
๋๋ค. ์ฃผ์ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
โข
Shape ์ธํฐํ์ด์ค (Element): ๋ฐฉ๋ฌธ์๋ฅผ ๋ฐ์๋ค์ด๋ accept() ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
โข
Circle, Rectangle ํด๋์ค (Concrete Elements): Shape ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ๋ํ ํด๋์ค์
๋๋ค. ๊ฐ๊ฐ accept() ๋ฉ์๋์์ ๋ฐฉ๋ฌธ์์ visit() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
โข
ShapeVisitor ์ธํฐํ์ด์ค (Visitor): ๊ฐ ๋ํ ํ์
์ ๋ํ visit() ๋ฉ์๋๋ฅผ ์ ์ธํฉ๋๋ค.
โข
AreaCalculator ํด๋์ค (Concrete Visitor): ShapeVisitor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ๊ฐ ๋ํ์ ๋์ด๋ฅผ ๊ณ์ฐํ๋ ๊ตฌ์ฒด์ ์ธ ๋์์ ์ ์ํฉ๋๋ค.
์ด ๊ตฌ์กฐ๋ฅผ ํตํด ์๋ก์ด ๋ํ์ ์ถ๊ฐํ ๋๋ Shape๋ฅผ ๊ตฌํํ๋ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ์๋ก์ด ๋์์ ์ถ๊ฐํ ๋๋ ShapeVisitor๋ฅผ ๊ตฌํํ๋ ์๋ก์ด ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด ๋ฉ๋๋ค. ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ต๋๋ค.