본문 바로가기

CS/DesignPattern

(DesignPattern) 방문자 패턴

방문자 패턴이란 무엇이고 왜 사용하는가?

객체에서 구조와 기능을 분리시킴으로써 구조는 변경하지 않고 기능만을 변경시켜 확장 가능하도록 도와주는 패턴

  • 컴포짓 패턴과 함께 사용되는 경우가 많다.

https://jwdeveloper.tistory.com/249?category=862052

 

(DesignPattern) 컴포짓 패턴

컴포짓 패턴이란 무엇이고 언제 사용하는가? 컴포짓 패턴은 단일 객체와 두 개 이상의 객체들의 집합을 같은 방법으로 처리하기 위해서 만들어진 패턴이다. 단일 객체와 객체들의 집합 간의 처�

jwdeveloper.tistory.com


실습

구조와 기능을 분리시키기 위해서 두 개의 인터페이스를 설정

  • Visitor : 실제 구현부 - Visitable을 참조
  • Visitable : Element Visitor가 방문하는 인터페이스 

Visitor - visit 메서드의 파라미터에 Visitable 타입이 들어가는 것에 주목

public interface Visitor {
	
	public void visit(Visitable visitable);

}

 

Visitable - accept 메서드의 파라미터에 Visitor 타입이 들어가는 것에 주목

public interface Visitable {
	
	public void accept(Visitor visitor);

}

VisitorA - Visitable 방문시 나이의 개수를 누적한다.

public class VisitorA implements Visitor{
	
	private int ageSum;
	
	public VisitorA() {
		// TODO Auto-generated constructor stub
		ageSum = 0;
	}

	@Override
	public void visit(Visitable visitable) {
		// TODO Auto-generated method stub
		if (visitable instanceof VisitableA) {
			
			ageSum += ((VisitableA) visitable).getAge();
			
		}else {
			
		}
		
	}
	
	public int getAgeSum() {
		return ageSum;
	}

}

VisitableA

public class VisitableA implements Visitable{
	
	private int age;
	
	public VisitableA(int age) {
		super();
		this.age = age;
	}

	@Override
	public void accept(Visitor visitor) {
		// TODO Auto-generated method stub
		visitor.visit(this);
	}
		
	public int getAge() {
		return age;
	}
}

Main

public class Main {
	
	public static void main(String[] args) {
	
		List<Visitable> visitables = new ArrayList<Visitable>();
		visitables.add(new VisitableA(1));
		visitables.add(new VisitableA(2));
		visitables.add(new VisitableA(3));
		visitables.add(new VisitableA(4));
		visitables.add(new VisitableA(5));
		
		Visitor visitor = new VisitorA();
		
		for (Visitable visitable : visitables) {
			visitable.accept(visitor);
		}
		
		System.out.println(((VisitorA) visitor).getAgeSum());
		
	}
}

References

 

 

'CS > DesignPattern' 카테고리의 다른 글

(DesignPattern) 옵져버 패턴(1)  (0) 2020.05.30
(DesignPattern) 책임사슬 패턴  (0) 2020.05.30
(DesignPattern) 데코레이터 패턴  (0) 2020.05.30
(DesignPattern) 컴포짓 패턴  (0) 2020.05.29
(DesignPattern) 브릿지 패턴  (0) 2020.05.17