Java 상용 디자인 모드 -- 프 록 시 모드 (프 록 시 패턴)

4048 단어 디자인 모드
대리 모델 이란 클 라 이언 트 가 실제 대상 을 직접 호출 하지 않 고 대 리 를 호출 하여 실제 대상 을 간접 적 으로 호출 하 는 것 을 말한다.프 록 시 모드 (Proxy Pattern) 는 구조 적 모드 에 속한다.
에이전트 모드 의 역할
  • 추상 적 인 대상 역할 (AbstractObject): 목표 대상 과 대리 대상 의 공동 인 터 페 이 스 를 설명 합 니 다. 이렇게 하면 목표 대상 을 사용 할 수 있 는 모든 곳 에서 대리 대상 을 사용 할 수 있 습 니 다.
  • 대상 역할 (RealObject): 대리 대상 이 대표 하 는 대상 을 정의 합 니 다.
  • 프 록 시 대상 역할 (ProxyObject): 프 록 시 대상 내부 에 대상 의 인용 이 포함 되 어 있어 대상 을 언제든지 조작 할 수 있 습 니 다.프 록 시 대상 은 언제든지 대상 을 대체 할 수 있 도록 대상 과 같은 인 터 페 이 스 를 제공 합 니 다.프 록 시 대상 은 클 라 이언 트 가 대상 에 게 전달 하기 전이 나 그 후에 특정한 조작 을 수행 합 니 다. 단순히 대상 에 게 전달 하 는 것 이 아 닙 니 다.

  •  예 를 들 어:
    당신 은 밀 크 티 를 마시고 싶 지만, 당신 은 스스로 밀 크 티 가게 에 가서 사고 싶 지 않 고, 배달 작은 형 을 찾 아 보 내 는 것 이 바로 대리 모델 입 니 다.
     정적 에이전트
    package com.example.proxy;
    
    /**
     *          
     */
    public interface BuyMilkyTea {
    
        void buyMilkyTea();
    
    }
    
    package com.example.proxy;
    
    /**
     *         
     */
    public class MyPeople implements BuyMilkyTea {
        @Override
        public void buyMilkyTea() {
            System.out.println("     ");
        }
    }
    
    package com.example.proxy;
    
    /**
     *            
     */
    public class TakeOutPeople implements BuyMilkyTea {
    
        private BuyMilkyTea buyMilkyTea;
    
        public TakeOutPeople(BuyMilkyTea buyMilkyTea) {
            this.buyMilkyTea = buyMilkyTea;
        }
    
        @Override
        public void buyMilkyTea() {
            System.out.println("     ,   ");
            buyMilkyTea.buyMilkyTea();
            System.out.println("     ,    ");
        }
    }
    
    package com.example.proxy;
    
    public class Test {
    
        public static void main(String[] args) {
    
            MyPeople myPeople = new MyPeople();
            TakeOutPeople takeOutPeople = new TakeOutPeople(myPeople);
            takeOutPeople.buyMilkyTea();
        }
    
    }
    

    단점: 대리 류 와 의뢰 류 는 같은 인 터 페 이 스 를 실현 하 는 동시에 같은 방법 을 실현 해 야 한다.이렇게 해서 대량의 코드 가 중복 되 었 다.인터페이스 에 하나의 방법 이 추가 되면 모든 실현 류 가 이 방법 을 실현 해 야 하 는 것 을 제외 하고 모든 대리 류 도 이 방법 을 실현 해 야 한다.코드 유지보수 의 복잡 도 를 증가 시 켰 다.
    동적 에이전트
    동적 대 리 는 정적 에이전트 와 달리 에이전트 의 대상 에 따라 동적 으로 프 록 시 클래스 를 만 듭 니 다.이렇게 하면 정적 에이전트 에서 에이전트 인터페이스 가 너무 많은 문 제 를 피 할 수 있다.동적 대 리 는 실현 방식 으로 반 사 를 통 해 이 루어 지 며 자바 자체 테이프 java.lang.reflect.Proxy 를 통 해 고정된 규칙 을 통 해 생 성 된다.그 절 차 는 다음 과 같다.
  • 의뢰 클래스 의 인 터 페 이 스 를 만 듭 니 다. 즉, 정적 에이전트 의 추상 적 인 대상 역할 (AbstractObject)
  • 진정한 의뢰 류, 즉 정적 에이전트 의 목표 대상 역할 (RealObject) 을 실현 합 니 다.
  • 동적 에이전트 클래스 를 만 들 고 InvocationHandler 인 터 페 이 스 를 실현 하 며 이 invoke 방법
  • 을 다시 씁 니 다.
  • 테스트 클래스 에서 동적 대 리 를 생 성 하 는 대상.

  •  
    package com.example.dynamicproxy;
    
    /**
     *          
     */
    public interface BuyMilkyTea {
    
        void buyMilkyTea();
    
    }
    
    package com.example.dynamicproxy;
    
    /**
     *         
     */
    public class MyPeople implements BuyMilkyTea {
        @Override
        public void buyMilkyTea() {
            System.out.println("     ");
        }
    }
    
    package com.example.dynamicproxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     *      
     */
    public class DynamicTakeOutPeople implements InvocationHandler {
    
        private Object object;
    
        public DynamicTakeOutPeople(Object object) {
            this.object = object;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object invoke = method.invoke(object, args);
            return invoke;
        }
    }
    
    package com.example.dynamicproxy;
    
    import java.lang.reflect.Proxy;
    
    public class Test {
    
        public static void main(String[] args) {
    
            MyPeople myPeople = new MyPeople();
            DynamicTakeOutPeople dynamicTakeOutPeople = new DynamicTakeOutPeople(myPeople);
            ClassLoader classLoader = dynamicTakeOutPeople.getClass().getClassLoader();
            BuyMilkyTea buyMilkyTea = (BuyMilkyTea)Proxy.newProxyInstance(classLoader, new Class[]{BuyMilkyTea.class}, dynamicTakeOutPeople);
            buyMilkyTea.buyMilkyTea();
        }
    
    }
    

    좋은 웹페이지 즐겨찾기