동적 에이전트와 정적 에이전트 관계

정적 프록시 클래스는 하나의 인터페이스에만 서비스를 제공할 수 있다. 그러면 프로그램 개발에서 과도한 프록시가 생길 수밖에 없다. 그리고 모든 프록시 작업은 호출하는 방법이 다른 것을 제외하고 다른 작업은 똑같다. 이때는 틀림없이 중복 코드이다.이 문제를 해결하는 가장 좋은 방법은 하나의 에이전트 클래스를 통해 모든 에이전트 기능을 완성할 수 있다는 것이다. 그러면 이때 반드시 동적 에이전트를 사용해야 한다.
따라서 동적 에이전트의 역할은 동적 생성 정적 에이전트 종류와 유사하다.
정적 프록시 클래스 코드:
커넥터:
package net.battier.dao;
                                                                               
/**
 *         
 *
 * @author Administrator
 *
 */
public interface Count {
    //       
    public void queryCount();
                                                                               
    //       
    public void updateCount();
                                                                               
}

구현 클래스:
package net.battier.dao.impl;
                                                                    
import net.battier.dao.Count;
                                                                    
public class CountImpl implements Count {
                                                                    
    @Override
    public void queryCount() {
        System.out.println("      ...");
                                                                    
    }
                                                                    
    @Override
    public void updateCount() {
        System.out.println("      ...");
                                                                    
    }
                                                                    
}

정적 프록시 클래스:
package net.battier.dao.impl;
                                                           
import net.battier.dao.Count;
                                                           
public class CountProxy implements Count {
    private CountImpl countImpl;
                                                           
    /**
     *        
     *
     * @param countImpl
     */
    public CountProxy(CountImpl countImpl) {
        this.countImpl = countImpl;
    }
                                                           
    @Override
    public void queryCount() {
        System.out.println("      ");
        //         ;
        countImpl.queryCount();
        System.out.println("      ");
    }
                                                           
    @Override
    public void updateCount() {
        System.out.println("      ");
        //         ;
        countImpl.updateCount();
        System.out.println("      ");
                                                           
    }
                                                           
}

호출 클래스:
package net.battier.test; 
                                       
import net.battier.dao.impl.CountImpl; 
import net.battier.dao.impl.CountProxy; 
                                       
public class TestCount { 
    public static void main(String[] args) { 
        CountImpl countImpl = new CountImpl(); 
        CountProxy countProxy = new CountProxy(countImpl); 
        countProxy.updateCount(); 
        countProxy.queryCount(); 
                                       
    } 
}

동적 프록시 클래스 코드:
커넥터:
package net.battier.dao; 
                                     
public interface BookFacade { 
    public void addBook(); 
}

구현 클래스:
package net.battier.dao.impl; 
                     
import net.battier.dao.BookFacade; 
                     
public class BookFacadeImpl implements BookFacade { 
                     
    @Override 
    public void addBook() { 
        System.out.println("      。。。"); 
    } 
                     
}

동적 프록시 클래스:
package net.battier.proxy; 
                
import java.lang.reflect.InvocationHandler; 
import java.lang.reflect.Method; 
import java.lang.reflect.Proxy; 
                
/**
 * JDK       
 * 
 * @author student
 * 
 */ 
public class BookFacadeProxy implements InvocationHandler { 
    private Object target; 
    /**
     *               
     * @param target
     * @return
     */ 
    public Object bind(Object target) { 
        this.target = target; 
        //       
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), 
                target.getClass().getInterfaces(), this);   //     (      ,cglib       ) 
    } 
                
    @Override 
    /**
     *     
     */ 
    public Object invoke(Object proxy, Method method, Object[] args) 
            throws Throwable { 
        Object result=null; 
        System.out.println("    "); 
        //     
        result=method.invoke(target, args); 
        System.out.println("    "); 
        return result; 
    } 
                
} 

호출 클래스:
package net.battier.test; 
    
import net.battier.dao.BookFacade; 
import net.battier.dao.impl.BookFacadeImpl; 
import net.battier.proxy.BookFacadeProxy; 
    
public class TestProxy { 
    
    public static void main(String[] args) { 
        BookFacadeProxy proxy = new BookFacadeProxy(); 
        BookFacade bookProxy = (BookFacade) proxy.bind(new BookFacadeImpl()); 
        bookProxy.addBook(); 
    } 
    
}

좋은 웹페이지 즐겨찾기