JAVA 디자인 모드:프록시(Proxy)

2398 단어 java 디자인 모드
프록시 모드는 이 대상에 대한 접근을 제어하기 위해 다른 대상에게 프록시를 제공합니다.
어떤 경우, 한 대상이 다른 대상을 원하지 않거나 직접 인용할 수 없으며, 대리 대상은 클라이언트와 목표 대상 사이에서 중개 역할을 할 수 있다.
대리 모델의 사상은 추가 처리나 다른 조작을 제공하기 위해 실제 대상과 호출자 사이에 대리 대상을 삽입하는 것이다.이러한 추가 작업은 일반적으로 실제 대상과 통신해야 한다.
필자는 에이전트 모델의 두 가지 핵심 내용을 정리했다. 첫째, 방문자가 방문 대상에 대한 직접적인 상호작용을 격리하고 방문 대상에 대한 모든 조작을 에이전트 대상을 통해 집행하는 것은 장식 모델과 외관 모델과 유사하다.다른 한편, 대리 대상은 피대리 대상의 업무 논리를 수정하여 일부 업무 논리를 증가하고 차단할 수 있다는 점은 장식과 외관 모델이 허용하지 않는 것이다.
프록시 모드에서 가장 많이 응용되는 장면은 업무 접근에 대한 전치와 후치 처리이다.노래를 부르는 예를 들면, 원래 한 가수가 노래를 부르는 대상이 있었는데, 지금은 가수가 무대에 올라 공연해야 하며, 노래 전후에 신문과 커튼콜을 하는 동작을 더해야 한다.가수가 매번 무대에 올라 공연하는 것이 아니기 때문에 노래의 유형을 직접 수정하고 커튼콜과 커튼콜을 하는 조작은 분명히 적합하지 않다. 여기서 대리 모드를 사용하여 이 문제를 해결한다.
interface Sing {
	void sing();
}

class Fancy implements Sing {

	@Override
	void sing() {
		System.out.println("  !");
	}

}

public class FancyProxy implements Sing {
	Sing singger;

	public FancyProxy(Sing singger) {
		this.singger = singger;
	}

	@Override
	public void sing() {
		//  
		baoMu();
		//  
		singger.sing();
		//  
		xieMu();
	}
}

위의 방식은 무대에 올라 공연하는 문제를 잘 해결했지만 이런 해결 방법은 반드시 디자인 단계에서 완성해야 하기 때문에 매우 큰 한계를 가진다.JDK는 실행 시 객체에 대한 에이전트를 생성할 수 있는 동적 만들기 도구를 제공합니다. 위 코드와 달리 여기서 흔히 말하는 동적 에이전트입니다.
class DynamicProxy implements InvocationHandler {
	private Object target;

	public DynamicProxy(Object target) {
		this.target = target;
	}

	public Object invoke(Object proxy, Method method, Object[] args) 
			throws Throwable {
		System.out.println("before calling " + method);
		method.invoke(target, args);
		System.out.println("after calling " + method);
		return null;
	}

	static void main(String[] args) {
		Fancy fancy = new Fancy(); //          
		InvocationHandler handler = new DynamicProxy(fancy); //       
		Class cls = fancy.getClass();
		Sing sing = (Sing) Proxy.newProxyInstance(cls.getClassLoader(), 
			cls.getInterfaces(), handler);
		sing.sing();
	}
}

이런 방식을 통해 프록시된 대상(Fancy)은 실행할 때 동적으로 바꿀 수 있고, 제어가 필요한 인터페이스(Sing 인터페이스)는 실행할 때 바꿀 수 있으며, 제어 방식(Dynamic Proxy 클래스)도 동적으로 바꿀 수 있어 매우 유연한 동적 프록시 관계를 실현할 수 있다.
추가 JAVA 디자인 모드
더 많은 훌륭한 오리지널 글은 필자의 오리지널 블로그를 주목해 주십시오.
http://www.coolfancy.com

좋은 웹페이지 즐겨찾기