티스토리 뷰

728x90
proxy : 대리인, 대변인이라는 뜻

실행시킬 클래스에 어떤 객체가 들어갈 자리를 
인터페이스를 통해 proxy를 대신 채우잖아?

Client쪽에서는 실행시킬 클래스를 통해서인지 proxy를 통해서인지 모르게 메서드 호출/반환 처리할 수 있다!

 

 

 

 

1. 공통 기능부와 개별핵심 기능부를 만들기

이 전장에서 아래처럼 해뒀잖아? 그걸 PROXY 통해서 공통로직 한 번만 쓰고 호출해보자

public interface Sister {

}
public class Soheny implements Sister {
	
	public void doSome() {
		System.out.println("집 도착 문열어!");
		
		try {
			System.out.println("간식 먹자");
			System.out.println("씻고 누워서 넷플보자");
		} catch (Exception e) {
			System.out.println("아 잔업있어");
		}finally {
			System.out.println("자자");
		}
	}
}
public class Lsl implements Sister {

	public void doSome() {
		System.out.println("집 도착 문열어!");
		
		try {
			System.out.println("밥먹고 내일 챙길 것들 챙기자");
			System.out.println("씻고 누워서 넷플보자");
		} catch (Exception e) {
			System.out.println("아 잔업있어");
		}finally {
			System.out.println("자자");
		}
	}
}

 

 

 

2. proxy를 이용해 공통부를 한 번만 작성하고 여러번 출력하기

Sister 인페 내부에 텅텅 클래스 doSomething()을 추가했다.
이제 Soheny와 Lsl 클래스에서 Sister상속 받은 상태에서
doSomething()을 재정의해 각각 자기 퇴근 스케줄에 맞게 사용할 것이다~

public interface Sister {
	public void doSomething();
}

 

Soheny클래스는 오자마자 마 간식부터 찾는다

public class Soheny implements Sister {
	
	public void doSomething() {
			System.out.println("간식 먹자");
	}
}

Lsl클래스는 착실하게 밥부터 먹고, 내일을 준비한다

public class Lsl implements Sister {

	public void doSomething() {
		System.out.println("밥먹고 내일 챙길 것들 챙기자");
}

 

그리고 나의 잡일 대리인 프록시를 데리고온다

SisterProxy클래스를 만드는데 Sister인페를 상속시킨다.
SisterProxy에서도 Sister 인페의 doSomething 메서드를 공통부를 위한 정의로서 따로 해준다

개별핵심부는 doSomething()으로 Soheny, Lsl 클래스에서 정의를 해줬잖아
그걸 각각 실행시키기 위해 Sister 클래스 타입의 sister 필드를 선언해주고, getter와 setter 메서드를 만든 다음,
sister.doSomething()으로 개별핵심부 자리에 넣어준다!

이제 메인 클래스에서 SisterProxy의 doSomething()메서드를 실행 시킬 때

public class SisterProxy implements Sister {

	private Sister sister;
	
	
	public Sister getSister() {
		return sister;
	}


	public void setSister(Sister sister) {
		this.sister = sister;
	}



	@Override
	public void doSomething() {
		System.out.println("집 도착 문열어!");
		try {
			sister.doSomething();
			System.out.println("씻고 누워서 넷플보자");
		} catch (Exception e) {
			System.out.println("아 잔업있어");
		}finally {
			System.out.println("자자");
		}
		
	}
	
}

 

이제 메인문에서 Sister 인페 타입의 soheny 변수를 생성하고, Soheny클래스의 기능, 속성을 추가해준다.
변수 lsl 역시 Sister인페 타입의 변수이고, Lsl 클래스 기능, 변수를 추가한다.

SisterProxy타입의 변수 proxy에는 SisterProxy 클래스의 기능, 속성을 넣어준다!

출력을 해보자면,
SisterProxy에서 정의한 domething()을 실행하는데, 개별핵심부는 각각 클래스마다 다르게 설정을 했잖아?
proxy.setSister("상단에서 설정한 변수(soheny or lsl)")
이런 식으로 개별 핵심부를 호출하는거야
그럼 아까 SisterProxy의 dosomething메서드에서 설정한 sister.something();요 sister자리에 soheny or lsl이 들어가겠지?

개별 핵심부를 실행했으면, 이제 공통부 역시 실행이 필요허니까
proxy.doSomething();으로 공통부를 실행시켜!

public class MainClass {

	public static void main(String[] args) {
		Sister soheny = new Soheny();
		Sister lsl = new Lsl();
		SisterProxy proxy = new SisterProxy();

		
		//단일책임의 원칙
		//setSister에서 핵심로직 실행
		proxy.setSister(lsl);
		//doSomething에서 공통부 실행
		proxy.doSomething();
		
		System.out.println("===============");
		
		//setSister에서 핵심로직 실행
		proxy.setSister(soheny);
		//doSomething에서 공통부 실행
		proxy.doSomething();
		
	}
}

 

결과 

타란~ 공통부를 한 번만 작성해도 되는 proxy!

 

But 단점이 존재하는데, 만약에 공통기능이 어마무시하게 크다면...?
핵심은 별거 없는데 의외로 공통로직이 엄청 긴 경우도 있잖아?
그럼 공통 로직도 핵심로직 했듯 메서드나 클래스로 만들어서 처리하면 좋을 것 같지!

그건 다음장에서 할거다

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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
글 보관함