디자인 모드 (4) - 프 록 시 모드
                                            
 26972 단어  디자인 모드
                    
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.2 과 asm-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           
	             
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.