모든 에이전트는 쇼핑을 할 때 많은 에이전트가 있으며 원본 제품 만 판매한다는 것을 알고 있습니다. 예를 들어, 매일 고기를 사고 싶다면 돼지는 농부가 자랐지 만 정육점에서 고기를 사면 정육점은 요원으로 간주 될 수 있습니다. 그렇다면 왜 에이전트가 필요합니까? 돼지가 당신에게 그것을 판매한다면, 정육점은 고기를 약간의 물로 채울 수 있습니다.
코드 로이 프로세스를 구현하는 방법 : 우리는 세 가지 범주를 사용해야합니다. 정육점과 농부는 각각, 정육점 및 농민을 참조하십시오. 그중에서도 농부는 또한 정육점을 부르는 고기를 구입하는 방법을 제공하고 돈의 양을 입력하고 모든 고기의 양을 반환하며 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
클래스 농부 {
공개 int buymeat (int money) {
int 고기 = 0;
// ... 고기 = ***;
고기를 돌려주십시오.
}
}
정육점은 고기를 구입하는 방법을 제공하고 고기를 반환하지만 고기를 처리하고 코드에서 돼지 머리를 면도합니다. 그렇지 않으면 돼지 수업을 작성해야합니다.). 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
클래스 정육점 {
공개 int buymeat (int money) {
농부 농부 = 새로운 농부 ();
int meat = farmer.buymeat (돈);
고기 += 5; // 3. 고기에 5 파운드의 물을 주입하면 체중이 증가합니다.
고기를 반환하십시오; // 4. 당신에게.
}
}
그러나 정육점에서 고기를 구입하는 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
클래스 you {
공개 void Work () {
int youmoney = 10;
정육점 정육점 = 새로운 정육점 ();
int meat = butcher.buymeat (youmoney);
System.out.println ( "고기, 체중 :" + 고기); // 요리했습니다.
}
}
우리는 또한이 프로그램을 최적화 할 수 있습니다. 정육점이나 농부가 판매 할 고기가있는 한, 우리는 인터페이스를 추출합니다.
코드 사본은 다음과 같습니다.
클래스 you {
공개 void Work () {
int youmoney = 10;
Peldar Peldar = New Butcher ();
int meat = peldar.buymeat (youmoney);
System.out.println ( "고기를 요리, 체중 :" + 고기);
}
}
인터페이스 Peldar {
int buymeat (int money);
}
클래스 정육점은 Peldar {
@보수
공개 int buymeat (int money) {
농부 농부 = 새로운 농부 ();
int meat = farmer.buymeat (돈);
고기 += 5; // 3. 고기에 5 파운드의 물을 주입하면 체중이 증가합니다.
고기를 반환하십시오; // 4. 당신에게.
}
}
클래스 농부는 Peldar {
@보수
공개 int buymeat (int money) {
int 고기 = 0;
// ... 고기 = ***;
고기를 돌려주십시오.
}
}
이것은 프록시입니다. 일반 프록시 클래스와 최종 클래스는 동일한 인터페이스를 구현할 가치가 있습니다.
그러나 프록시 클래스 (정육점 클래스)가 귀하가 작성하고 동적 프록시는 Java가 실행될 때 동등한 프록시 클래스를 동적으로 생성하는 것이기 때문에이를 정적 프록시라고합니다. 수업이 동적으로 생성되지만 돼지를 죽이고 물 주사를위한 코드는 여전히 작성되어야하지만 더 이상 수업을 쓰지 마십시오. 글을 쓸 위치? 다음 인터페이스에 작성하십시오.
코드 사본은 다음과 같습니다.
공개 인터페이스 invocationHandler {
공개 객체 호출 (객체 프록시, 메소드 메소드, 개체 [] args) 던지기 가능;
}
매개 변수는 무엇을 의미합니까?
코드 사본은 다음과 같습니다.
공개 인터페이스 invocationHandler {
공개 물체 호출 (물체 정육점, 방법 buymeat, 대상 [] 돈) 던지기 가능;
}
첫 번째 매개 변수는 자동으로 생성 된 프록시 클래스 (자동으로 생성되는 정육점 클래스의 객체)의 객체이며, 두 번째 매개 변수는 호출되는 메소드의 객체입니다 (방법에 객체가있는 방법, Java를 참조하십시오. 반사 메커니즘). Buymeat라는 하나의 메소드가 있으므로이 매개 변수는이를 나타내는 매개 변수는 이전 메소드에 전달됩니다. 따라서 돼지를 죽이고 물을 채우는 코드는 작성 될 때 다음과 같습니다.
코드 사본은 다음과 같습니다.
invocationHandler minVocationHandler = new invocationHandler () {
@보수
공개 대상 호출 (물체 정육점, 메소드 Buymeat, Object [] args) 던지기 가능 {
농부 농부 = 새로운 농부 ();
int meat = (정수) buymeat.invoke (농부, args);
고기 += 5; // 3. 고기에 5 파운드의 물을 주입하면 체중이 증가합니다.
고기를 반환하십시오; // 4. 당신에게.
}
};
이것은 농부의 육류 구매 방법을 호출하는 기존의 방법과 일치하지 않습니다. 그런 다음 직접 호출하지 않는 이유는 무엇입니까? 당신은 많은 농부 객체가 있는데, 심지어 농부 객체조차도 특정 인터페이스의 인스턴스로 사용할 수 있습니다 (인터페이스는 아래에 지정되어 있고, 먼저 이름을 지정하자), 매개 변수로 전달 될 수 있습니다. 이제 프록시 클래스를 생성하는 방법을 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
public static 객체 NewProxyInstance (클래스 로더 로더, 클래스 <?> [] 인터페이스, invocationHandler h)
불법 행위를 던진다
매개 변수를 설명하십시오. 첫 번째 클래스 로더는 프록시 클래스를로드하는 데 사용됩니다 인터페이스는 새로 생성됩니다. 배열에서, 이전 단락에서 언급 된 호출은 실패 문제도 명확하다는 것입니다. 세 번째 매개 변수 인 InvocationHandler는 더 잘 이해됩니다. 전체 코드는 아래에 기록됩니다.
코드 사본은 다음과 같습니다.
클래스 you {
공개 void Work () {
int youmoney = 10;
Peldar Peldarproxy = (Peldar) proxy.newproxyInstance (getClass (). getClassLoader (), New Class [] {peldar.class}, minvoctionHandler);
int meat = peldarproxy.buymeat (youmoney);
System.out.println ( "고기를 요리, 체중 :" + 고기);
}
invocationHandler minVocationHandler = new invocationHandler () {
@보수
공개 대상 호출 (Object Butcher, Method Buymeat, Object [] args)
던질 수있는 {
농부 농부 = 새로운 농부 ();
int meat = (정수) buymeat.invoke (농부, args);
고기 += 5; // 3. 고기에 5 파운드의 물을 주입하면 체중이 증가합니다.
고기를 반환하십시오; // 4. 당신에게.
}
};
}
인터페이스 Peldar {
int buymeat (int money);
}
클래스 농부는 Peldar {
@보수
공개 int buymeat (int money) {
int 고기 = 0;
// ... 고기 = ***;
고기를 돌려주십시오.
}
}
여기에서 프록시 클래스에서 프록시 클래스의 buymeat가 호출되면 코드는 이전 정적 프록시와 동일합니다.