프 록 시 모드(Java)

프 록 시 모델 은 구조 형 디자인 모델 에 속 하 는데 주로 원시 코드 를 바 꾸 지 않 은 상황 에서 프 록 시 클래스 를 도입 하여 원시 클래스 에 추가 기능 을 부여 한다.
정적 에이전트
레코드 코드 실행 시간
/*
 *         
 */ 
class Logger {
    public static void record(long startTime, long endTime){
        System.out.println("   "+ (endTime - startTime) + "  ");
    }
}

interface IUserService {
    void add();
}

class UserServiceImpl implements IUserService {

    @Override
    public void add() {
        try {
            //    ,      
            Thread.sleep((long) (Math.random() * 1000));
            System.out.println("          ");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

class UserServiceProxy implements IUserService {

    private IUserService userService;

    public UserServiceProxy(IUserService userService) {
        this.userService = userService;
    }

    @Override
    public void add() {
        long startTime = System.currentTimeMillis();
        userService.add();
        long endTime = System.currentTimeMillis();
        Logger.record(startTime, endTime);
    }
}

class UserServiceProxyTest {
    public static void main(String[] args) {
        IUserService userService = new UserServiceProxy(new UserServiceImpl());
        userService.add();
    }
}

  : 
          
   601  

정적 프 록 시 는 비교적 간단 하지만 문제 가 존재 합 니 다.만약 에 우리 가 100 개의 클래스 가 실행 시간 을 기록 하려 면 100 개의 프 록 시 클래스 를 만들어 야 합 니 다.유지 비용 이 너무 높 고 모든 프 록 시 클래스 의 코드 논 리 는 똑 같 습 니 다.그럼 어떻게 해결 하고 문 제 를 찾 아야 하나 요?우 리 는 동적 대 리 를 사용 하여 해결 할 수 있 습 니 다.다음은 자바 가 제공 하 는 동적 대리 의 용법 을 먼저 보 겠 습 니 다.
JDK 동적 에이전트
/*
 *         
 */
class Logger implements InvocationHandler {

    private Object proxyObject;

    /*
     *        
     */ 
    public Object createProxy(Object proxyObject){
        this.proxyObject = proxyObject;
        Class> clazz = proxyObject.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object obj = method.invoke(proxyObject, args);
        long endTime = System.currentTimeMillis();
        System.out.println("   "+ (endTime - startTime) + "  ");
        return obj;
    }
}

interface IUserService {
    void add();
}

class UserServiceImpl implements IUserService {

    @Override
    public void add() {
        try {
            //    ,      
            Thread.sleep((long) (Math.random() * 1000));
            System.out.println("          ");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


class UserServiceProxyTest {
    public static void main(String[] args) {
        Logger logger = new Logger();
        UserServiceImpl userService = new UserServiceImpl();
        IUserService userServiceProxy = (IUserService)logger.createProxy(userService);
        userServiceProxy.add();
    }
}
  :
          
   166  

JDK 동적 프 록 시 를 사용 하면 실행 시간 을 기록 해 야 하 는 모든 클래스 에 프 록 시 클래스 를 만 들 필요 가 없습니다.자바 는 동적 으로 대응 하 는 프 록 시 클래스 를 만 들 것 입 니 다.

좋은 웹페이지 즐겨찾기