디자인 모드 (4) - 프 록 시 모드

26972 단어 디자인 모드
1. 정의
Provide a surrogate or placeholder for another object to control access to it.   이 대상 에 대한 접근 을 제어 하기 위해 다른 대상 에 게 에이 전 트 를 제공 합 니 다.
2. 코드
2.1 정적 에이전트
	     ,                 。

추상 클래스:
//                
public abstract class AbstractObject {
    protected abstract void doSomething();
}

대상:
//         
public class RealObject extends AbstractObject {
    @Override
    protected void doSomething() {
        System.out.println("           ");
    }
}

에이전트 대상:
//         
public class ProxyObject extends AbstractObject {
    //             
    private AbstractObject object;

    public ProxyObject(AbstractObject object) {
        this.object = object;
    }

    @Override
    protected void doSomething() {
        System.out.println("             ");
        object.doSomething();
        System.out.println("             ");
    }
}

테스트 클래스:
public class TestMain {
    public static void main(String[] args) {
        //    
        System.out.println("    ");
        //          
        ProxyObject object = new ProxyObject(new RealObject());
        //        
        object.doSomething();
    }
}

결과:
	    
	             
	           
	             

정적 대 리 는 목표 대상 을 바 꾸 지 않 고 기능 을 확장 할 수 있 지만 목표 대상 과 같은 인터페이스 나 추상 류 를 실현 해 야 합 니 다. 인터페이스 가 증가 하면 둘 다 유지 해 야 하기 때문에 동적 대 리 를 사용 할 수 있 습 니 다.
2.2 동적 에이전트
	      ,                   。

동적 에이전트 가 실현 되 려 면 newProxyInstance() 방법 으로 세 개의 인 자 를 받 아야 합 니 다.즉 newProxyInstance(ClassLoader loader,Class>[] interfaces,InvocationHandler h)추상 클래스 인터페이스:
//    -          
public interface IUserLogin {
    void saveUserName();
}

대상:
//          
public class User implements IUserLogin {
    @Override
    public void saveUserName() {
        System.out.println("             ");
    }
}

동적 에이전트 대상:
//    ,              
public class DynamicProxyObject {
    private Object object;//    

    public DynamicProxyObject(Object object) {
        this.object = object;
    }

    public Object getDynamicProxyInstance() {
        return Proxy.newProxyInstance(
                object.getClass().getClassLoader(),
                object.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("             ");
                        Object value = method.invoke(object, args);
                        System.out.println("             ");
                        return value;
                    }
                }
        );
    }
}

테스트 클래스:
public class TestMain {
    public static void main(String[] args) {
        //    
        System.out.println("    ");
        //          
        ProxyObject object = new ProxyObject(new RealObject());
        //        
        object.doSomething();
        
        //    
        System.out.println("-------------
"
); IUserLogin user = new User(); // DynamicProxyObject dynamicProxyObject = new DynamicProxyObject(user); // , IUserLogin proxy = (IUserLogin) dynamicProxyObject.getDynamicProxyInstance(); proxy.saveUserName();// } }

결과:
	    
	             
	           
	             
	-------------
	    
	             
	             
	             

2.3 Cglib 에이전트
대상 이 추상 류 나 인 터 페 이 스 를 실현 할 필요 가 없 을 때 사용 할 수 있 습 니 다 Cglib 대 리 는 먼저 도입 Cglib jar 해 야 합 니 다. 잘못 보고 하면 인용 asm jar 이 필요 할 수도 있 습 니 다. 다운로드 버 전 을 클릭 하면 오류 가 발생 할 수 있 습 니 다. 저 는 cglib-2.2.2asm-3.3 버 전 을 사용 합 니 다.
구현 되 지 않 은 인터페이스의 대상:
//           
public class User2 {
    public void saveUserName() {
        System.out.println("  2           ");
    }
}

메모리 에서 하위 클래스 대상 동적 생 성
public class DynamicCglibProxyObject implements MethodInterceptor{
    private Object object;
	//      
    public DynamicCglibProxyObject(Object object) {
        this.object = object;
    }
	
    public Object getCglibProxyInstance() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(object.getClass());
        //  
        enhancer.setCallback(this);
        //        
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
     throws Throwable {
        System.out.println("             ");
        Object value = method.invoke(object, objects);
        System.out.println("             ");
        return value;
    }
}

테스트 클래스:
public class TestMain {
    public static void main(String[] args) {
        //    
        System.out.println("    ");
        //          
        ProxyObject object = new ProxyObject(new RealObject());
        //        
        object.doSomething();

        //    
        System.out.println("-------------
"
); IUserLogin user = new User(); // DynamicProxyObject dynamicProxyObject = new DynamicProxyObject(user); // , IUserLogin proxy = (IUserLogin) dynamicProxyObject.getDynamicProxyInstance(); proxy.saveUserName();// //Cglib , System.out.println("-------------
Cglib "
);//jar , User2 user2 = new User2(); DynamicCglibProxyObject dynamicCglibProxyObject = new DynamicCglibProxyObject(user2); User2 proxy2 = (User2) dynamicCglibProxyObject.getCglibProxyInstance(); proxy2.saveUserName(); } }

결과:
	    
	             
	           
	             
	-------------
	    
	             
	             
	             
	-------------
	Cglib  
	             
	  2           
	             

좋은 웹페이지 즐겨찾기