디자인 모드 (4) - 프 록 시 모드
26972 단어 디자인 모드
Provide a surrogate or placeholder for another object to control access to it. 이 대상 에 대한 접근 을 제어 하기 위해 다른 대상 에 게 에이 전 트 를 제공 합 니 다.
2. 코드
2.1 정적 에이전트
, 。
추상 클래스:
//
public abstract class AbstractObject {
protected abstract void doSomething();
}
대상:
//
public class RealObject extends AbstractObject {
@Override
protected void doSomething() {
System.out.println(" ");
}
}
에이전트 대상:
//
public class ProxyObject extends AbstractObject {
//
private AbstractObject object;
public ProxyObject(AbstractObject object) {
this.object = object;
}
@Override
protected void doSomething() {
System.out.println(" ");
object.doSomething();
System.out.println(" ");
}
}
테스트 클래스:
public class TestMain {
public static void main(String[] args) {
//
System.out.println(" ");
//
ProxyObject object = new ProxyObject(new RealObject());
//
object.doSomething();
}
}
결과:
정적 대 리 는 목표 대상 을 바 꾸 지 않 고 기능 을 확장 할 수 있 지만 목표 대상 과 같은 인터페이스 나 추상 류 를 실현 해 야 합 니 다. 인터페이스 가 증가 하면 둘 다 유지 해 야 하기 때문에 동적 대 리 를 사용 할 수 있 습 니 다.
2.2 동적 에이전트
, 。
동적 에이전트 가 실현 되 려 면
newProxyInstance()
방법 으로 세 개의 인 자 를 받 아야 합 니 다.즉 newProxyInstance(ClassLoader loader,Class>[] interfaces,InvocationHandler h)
추상 클래스 인터페이스:// -
public interface IUserLogin {
void saveUserName();
}
대상:
//
public class User implements IUserLogin {
@Override
public void saveUserName() {
System.out.println(" ");
}
}
동적 에이전트 대상:
// ,
public class DynamicProxyObject {
private Object object;//
public DynamicProxyObject(Object object) {
this.object = object;
}
public Object getDynamicProxyInstance() {
return Proxy.newProxyInstance(
object.getClass().getClassLoader(),
object.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(" ");
Object value = method.invoke(object, args);
System.out.println(" ");
return value;
}
}
);
}
}
테스트 클래스:
public class TestMain {
public static void main(String[] args) {
//
System.out.println(" ");
//
ProxyObject object = new ProxyObject(new RealObject());
//
object.doSomething();
//
System.out.println("-------------
");
IUserLogin user = new User();
//
DynamicProxyObject dynamicProxyObject = new DynamicProxyObject(user);
// ,
IUserLogin proxy = (IUserLogin) dynamicProxyObject.getDynamicProxyInstance();
proxy.saveUserName();//
}
}
결과:
-------------
2.3 Cglib 에이전트
대상 이 추상 류 나 인 터 페 이 스 를 실현 할 필요 가 없 을 때 사용 할 수 있 습 니 다
Cglib
대 리 는 먼저 도입 Cglib jar
해 야 합 니 다. 잘못 보고 하면 인용 asm jar
이 필요 할 수도 있 습 니 다. 다운로드 버 전 을 클릭 하면 오류 가 발생 할 수 있 습 니 다. 저 는 cglib-2.2.2
과 asm-3.3
버 전 을 사용 합 니 다.구현 되 지 않 은 인터페이스의 대상:
//
public class User2 {
public void saveUserName() {
System.out.println(" 2 ");
}
}
메모리 에서 하위 클래스 대상 동적 생 성
public class DynamicCglibProxyObject implements MethodInterceptor{
private Object object;
//
public DynamicCglibProxyObject(Object object) {
this.object = object;
}
public Object getCglibProxyInstance() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(object.getClass());
//
enhancer.setCallback(this);
//
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
throws Throwable {
System.out.println(" ");
Object value = method.invoke(object, objects);
System.out.println(" ");
return value;
}
}
테스트 클래스:
public class TestMain {
public static void main(String[] args) {
//
System.out.println(" ");
//
ProxyObject object = new ProxyObject(new RealObject());
//
object.doSomething();
//
System.out.println("-------------
");
IUserLogin user = new User();
//
DynamicProxyObject dynamicProxyObject = new DynamicProxyObject(user);
// ,
IUserLogin proxy = (IUserLogin) dynamicProxyObject.getDynamicProxyInstance();
proxy.saveUserName();//
//Cglib ,
System.out.println("-------------
Cglib ");//jar ,
User2 user2 = new User2();
DynamicCglibProxyObject dynamicCglibProxyObject = new DynamicCglibProxyObject(user2);
User2 proxy2 = (User2) dynamicCglibProxyObject.getCglibProxyInstance();
proxy2.saveUserName();
}
}
결과:
-------------
-------------
Cglib
2
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.