자바 디자인 모드 - 프 록 시 모드 상세 설명

1. 대리 모드 가 무엇 입 니까?대리 모델 이라는 디자인 모델 은 대리 대상 을 사용 하여 목표 대상 을 집행 하 는 방법 이 고 대리 대상 에서 목표 대상 을 강화 하 는 방법 을 사용 하 는 디자인 모델 이다.대리 대상 이 대상 을 수행 하 는 방법 을 대신 하고 이 를 바탕 으로 해당 하 는 확장 을 한다.좀 까다 로 운 것 같 습 니 다. 먼저 개폐 원칙 (확장 개방, 수정 폐쇄) 을 소개 합 니 다.좋 은 디자인 모델, 심지어 구 조 는 모두 기 존의 형 태 를 수정 하지 않 는 토대 에서 새로운 기능 을 확대 하 는 것 이다.프 록 시 모드 의 요 소 는 공동 인터페이스, 프 록 시 대상, 목표 대상 입 니 다.프 록 시 모드 의 행위: 프 록 시 대상 이 대상 을 수행 하 는 방법, 프 록 시 대상 이 대상 을 확장 하 는 방법.프 록 시 모드 의 거시적인 특성: 클 라 이언 트 에 대해 인터페이스 만 노출 하고 다음 과 같은 구 조 를 노출 하지 않 습 니 다.대리 모델 의 미시적 특성: 각 원 은 세 가지 유형 으로 구성 된다.프 록 시 모드 의 종류: 정적 에이전트, 동적 에이전트 (jdk 동적 에이전트, cglib 동적 에이전트, Spring 과 AspectJ 가 실현 하 는 동적 에이전트)
2. 정적 에이전트;
interface Network { //   Network   
    public void browse(); //           
}  
   
class Real implements Network { //         
    public void browse() { //        
        System.out.println("      !");  
    }  
}  
   
class Proxy implements Network { //      
    private Network network;  
   
    public Proxy(Network network) {//           
        this.network = network; //         
    }  
   
    public void check() { //        
        System.out.println("        !");  
    }  
   
    public void browse() {  
        this.check(); //             
        this.network.browse(); //           
    }  
}  
   
public class ProxyDemo {  
    public static void main(String args[]) {  
        Network net = null; //        
        net = new Proxy(new Real()); //      ,            
        net.browse(); //            
    }  
} 

3. 동적 에이전트, jdk 동적 에이전트, cglib 동적 에이전트 인터페이스 로 나 뉜 다.
public interface DAOInterface {
    public void add();
    public void delete();
    public void update();
    public void query();
}

묵인 실현
public class UserDao implements DAOInterface {

    @Override
    public void add() {
        System.out.println("        add");
    }

    @Override
    public void delete() {
        System.out.println("        delete");
    }

    @Override
    public void update() {
        System.out.println("        update");
    }

    @Override
    public void query() {
        System.out.println("        query");
    }

}

jdk 동적 에이전트
public class ProxyTest {

    public static void main(String[] args){
        final DAOInterface userDao = new UserDao();
        DAOInterface proxy = (DAOInterface) Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces()
                , new InvocationHandler() {
                    //                 
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("           :"+method.getName());
                        Object o = method.invoke(userDao, args);//        
                        return o;
                    }
                });
        proxy.delete();
    }
}

Cglib 동적 에이전트
public class CglibTest {

    public static void main(String[] args){
        final UserDao target = new UserDao();
        Enhancer en = new Enhancer();
        //         
        en.setSuperclass(target.getClass());
        //    
        en.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
                System.out.println("            "+arg1.getName());
                Object obj = arg1.invoke(target, arg2);
                return obj;
            }
        });
        UserDao proxy = (UserDao) en.create();
        proxy.add();
    }
}


참고 자료:https://www.cnblogs.com/chentingk/p/6433372.html

좋은 웹페이지 즐겨찾기