소개: 프록시 모드는 특정 개체에 대한 프록시 개체를 제공하며 프록시 개체는 원본 개체에 대한 참조 및 액세스를 제어합니다. 객체에 접근하기 전, 접근 후, 예외 등의 상황을 처리할 수 있습니다. 클래스 강화(상속, 장식, 대리)의 수단으로 이해될 수 있습니다.
一, function
중간 격리 기능: 어떤 경우에는 클라이언트 클래스가 대리자 개체를 직접 참조하는 것을 원하지 않거나 직접 참조할 수 없지만 프록시 클래스 개체는 참조할 수 있습니다. 클라이언트에서 사용되는 클래스와 델리게이트 객체 사이의 중개 역할을 하며, 프록시 클래스와 델리게이트 클래스가 동일한 인터페이스를 구현하는 것이 특징입니다.
열기 및 닫기 원리, 기능 추가: 에이전트 클래스는 클라이언트 클래스와 대리자 클래스 간의 중개자 역할 외에도 추가 기능을 추가하여 대리자 클래스를 확장할 수도 있습니다. 에이전트 클래스 함수에 대해 이러한 방식으로 위임 클래스를 수정하지 않고 프록시 클래스만 수정하면 되며 이는 코드 디자인의 열기 및 닫기 원칙을 준수합니다. 프록시 클래스는 주로 대리자 클래스에 대한 메시지 전처리, 메시지 필터링, 대리자 클래스에 메시지 전달 및 이후 반환된 결과 처리를 담당합니다. Proxy 클래스 자체가 실제로 서비스를 구현하지는 않지만, Delegate 클래스의 해당 메소드를 호출하여 특정 서비스를 제공합니다. 실제 비즈니스 기능은 여전히 대리자 클래스에 의해 구현되지만 일부 공용 서비스는 비즈니스 기능 실행 전후에 추가될 수 있습니다. 예를 들어 프로젝트에 캐싱 및 로깅 기능을 추가하려는 경우 캡슐화된 대리자 클래스를 열지 않고도 프록시 클래스를 사용하여 완료할 수 있습니다.
2. 프록시 모드 분류
정적 프록시는 프로그램이나 특정 도구에 의해 생성되며 자동으로 소스 코드를 생성하고 컴파일합니다. 프로그램이 실행되기 전에 프록시 클래스 .class 파일이 생성되었습니다.
동적 프록시는 프로그램이 실행될 때 반사 메커니즘을 통해 동적으로 생성됩니다.
3. 코드 구현
정적 프록시
// 第一步,创建服务类接口 public interface BuyHouse { void buyHosue(); } /** * 第二步,实现服务接口 */ public class BuyHouseImpl implements BuyHouse { @Override public void buyHosue() { System.out.println("我要买房"); } } /** * 第三步,创建代理类 */ public class BuyHouseProxy implements BuyHouse { private BuyHouse buyHouse; public BuyHouseProxy(final BuyHouse buyHouse) { this.buyHouse = buyHouse; } @Override public void buyHosue() { System.out.println("买房前准备"); buyHouse.buyHosue(); System.out.println("买房后装修"); } } /** * 第四步,编写实现类 */ public class ProxyTest { public static void main(String[] args) { BuyHouse buyHouse = new BuyHouseImpl(); buyHouse.buyHosue(); BuyHouseProxy buyHouseProxy = new BuyHouseProxy(buyHouse); buyHouseProxy.buyHosue(); } }
동적 프록시
동적 프록시에서는 더 이상 수동으로 프록시 클래스를 생성할 필요가 없으며 동적 프록시만 작성하면 됩니다. 프록시 프로세서는 괜찮습니다. 실제 프록시 객체는 런타임 시 JDK에 의해 동적으로 생성됩니다.
/** * 第一步:编写动态处理器 */ public class DynamicProxyHandler implements InvocationHandler { private Object object; public DynamicProxyHandler(final Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("买房前准备"); Object result = method.invoke(proxy, args); System.out.println("买房后装修"); return result; } } /** * 第二步:编写测试类 */ public class DynamicProxyTest { public static void main(String[] args) { BuyHouse buyHouse = new BuyHouseImpl(); BuyHouse proxyBuyHouse = (BuyHouse) Proxy.newProxyInstance(BuyHouse.class.getClassLoader(), new Class[]{BuyHouse.class}, new DynamicProxyHandler(buyHouse)); proxyBuyHouse.buyHosue(); } }
관련 권장사항:
자주 사용되는 Java 디자인 패턴에 대한 자세한 설명 - 팩토리 패턴
Java 디자인 패턴 중 프록시 패턴(프록시 패턴) 소개
위 내용은 Java에서 일반적으로 사용되는 프록시 디자인 패턴 - 예제 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!