학습 노트 - 대리 모델
8771 단어 디자인 모드
프 록 시 모드: 다른 대상 에 게 대역 이나 자리 표시 자 를 제공 하여 이 대상 에 대한 접근 을 제어 합 니 다.
프 록 시 모드 를 사용 하여 대표 대상 을 만 들 고 대상 이 특정한 대상 의 방문 을 제어 하도록 합 니 다. 프 록 시 대상 은 원 격 대상 (원 격 에이전트), 비용 이 많이 드 는 대상 (가상 에이전트) 을 만 들 거나 안전 제어 대상 (보호 에이전트) 을 만 들 수 있 습 니 다.
원 격 에이전트: 다른 JVM 대상 의 로 컬 대표 가 될 수 있 습 니 다.프 록 시 를 호출 하 는 방법 은 프 록 시 에 의 해 네트워크 를 이용 하여 원 격 으로 전송 되 고 결 과 는 네트워크 를 통 해 프 록 시 에 게 되 돌아 간 다음 에 프 록 시 에서 결 과 를 고객 에 게 되 돌려 줍 니 다.
가상 에이전트: 비용 이 많이 드 는 대상 을 만 드 는 대표 입 니 다.가상 에이 전 트 는 우리 가 진정 으로 대상 이 필요 할 때 까지 만 듭 니 다.대상 이 생 성 전과 생 성 중 일 때 가상 에이전트 가 대상 의 대역 을 맡 습 니 다.대상 이 생 성 되면 대 리 는 요청 을 대상 에 게 직접 의뢰 합 니 다.
동적 에이전트: 자바 는 자바. lang. reflect 패키지 에 자신의 프 록 시 지원 이 있 습 니 다. 이 패 키 지 를 이용 하여 실행 할 때 동적 으로 프 록 시 클래스 를 만 들 고 하나 이상 의 인 터 페 이 스 를 실현 하 며 방법 을 지정 한 클래스 로 전송 할 수 있 습 니 다.실제 프 록 시 클래스 는 실행 할 때 만 든 것 입 니 다. 자바 에서 우 리 는 이 기술 을 동적 에이전트 라 고 부 릅 니 다.자바 의 동적 대 리 를 이용 하여 보호 대 리 를 실현 할 수 있 습 니 다.
방화벽 에이전트: 네트워크 자원 의 방문 을 통제 하고 주 제 를 '나 쁜 고객' 의 침해 로부터 보호 합 니 다.
스마트 참조 에이전트: 테마 가 인 용 될 때 대상 이 인 용 된 횟수 를 계산 하 는 등 추가 동작 을 합 니 다.
캐 시 에이전트: 비용 이 많이 드 는 연산 결 과 를 일시 적 으로 저장 하고 여러 고객 이 결 과 를 공유 하여 계산 이나 네트워크 지연 을 줄 입 니 다.
동기 화 에이전트: 다 중 스 레 드 의 경우 테마 에 안전 한 접근 을 제공 합 니 다.
복잡 한 숨겨 진 에이전트: 복잡 한 집합의 복잡 도 를 숨 기 고 접근 제 어 를 하 는 데 사 용 됩 니 다.때로는 외관 에이전트 가 되 기도 한다.복잡 한 숨겨 진 프 록 시 와 외관 모드 는 다 릅 니 다. 프 록 시 접근 을 제어 하기 때문에 외관 모드 는 다른 인터페이스 만 제공 합 니 다.
기록 할 때 복사 에이전트: 대상 의 복 제 를 제어 하 는 방법 은 지연 대상 의 복사 입 니 다. 고객 이 진정 으로 필요 하 다 는 것 을 알 때 까지 가상 에이전트 의 변형 입 니 다.
원 격 서비스 만 들 기
(1) 원 격 인터페이스 만 들 기
(2) 제작 원 격 실현
(3) rmic 를 이용 하여 stub 와 skeleton 생 성
(4) RMI 레 지 스 트 리 시작
(5) 원 격 서비스 시작
설계 원칙
패 키 징 변화
조합 을 많이 쓰 고 계승 을 적 게 쓰다.
인터페이스 프로 그래 밍
대화 대상 간 의 전송 결합 디자인 을 위해 노력 하 다.
클래스 는 확장 개발, 수정 에 대해 닫 아야 합 니 다.
추상 에 의존 하고 구체 적 인 유형 에 의존 하지 않 는 다.
친구 와 만 이야기 하 다
나 를 찾 지 마라, 내 가 너 를 찾 을 것 이다
클래스 는 변 하 는 이유 가 하나 밖 에 없어 야 한다.
요점
대 리 는 구조 적 으로 장식 자 와 유사 하지만 목적 은 다르다.장식 자 모델 은 대상 에 행 위 를 더 하고 대 리 는 통제 행위 이다.
다른 포장 자 와 마찬가지 로 대 리 는 당신 의 디자인 중의 수량 을 증가 시 킬 것 입 니 다.
원 격 에이전트
import java.rmi.Remote;// rmiregistry lookup naming java.rmi
import java.rmi.RemoteException;
//extends Remote
public interface GumballMachineRemote extends Remote {
// , RemoteException
// “ ”
public int getCount() throws RemoteException;
public String getLocation() throws RemoteException;
// ,
public State getState() throws RemoteException;
}
// Serializable , State
public interface State extends Serializable {
public void insertQuarter();
public void ejectQuarter();
public void turnCrank();
public void dispense();
}
public class HasQuarterState implements State {
private static final long serialVersionUID = 768887299984514010L;
Random randomWinner = new Random(System.currentTimeMillis());
// State , GumballMachine transient , JVM
transient GumballMachine gumballMachine;
//
}
//GumballMachine UnicastRemoteObject
//GumballMachine GumballMachineRemote
public class GumballMachine extends UnicastRemoteObject implements
GumballMachineRemote {
/**
*
*/
private static final long serialVersionUID = -2838970117227273571L;
State soldOutState;
State noQuarterState;
State hasQuarterState;
State soldState;
State winnerState;
State state = soldOutState;
int count = 0;
String location;
// RemoteException,
public GumballMachine(String location, int numberGumballs)
throws RemoteException {
soldOutState = new SoldOutState(this);
noQuarterState = new NoQuarterState(this);
hasQuarterState = new HasQuarterState(this);
soldState = new SoldState(this);
winnerState = new WinnerState(this);
this.count = numberGumballs;
if (numberGumballs > 0)
state = noQuarterState;
this.location = location;
}
public void insertQuarter() {
state.insertQuarter();
}
public void ejectQuarter() {
state.ejectQuarter();
}
public void turnCrank() {
state.turnCrank();
state.dispense();
}
void setState(State state) {
this.state = state;
}
void releaseBall() {
System.out.println("A gumball comes rolling out the slot...");
if (count != 0) {
count = count - 1;
}
}
public void refill(int count) {
this.count = count;
state = noQuarterState;
}
public int getCount() {
return count;
}
public State getState() {
return state;
}
public String getLocation() {
return location;
}
//
}
// RMI register
public class GumballMachineTestDrive {
public static void main(String[] args) {
GumballMachineRemote gumballMachine = null;
int count;
if (args.length < 2) {
System.out.println("GumballMachine ");
System.exit(1);
}
try {// try/catch,
count = Integer.parseInt(args[1]);
gumballMachine = new GumballMachine(args[0], count);
// Naming.rebind , gumballmachine GumballMachine stub
Naming.rebind("//" + args[0] + "/gumballmachine", gumballMachine);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//GumballMonitor
public class GumballMonitor {
// GumballMachineRemote ,
GumballMachineRemote machine;
public GumballMonitor(GumballMachineRemote machine) {
this.machine = machine;
}
public void report() {
// ,
try {
System.out.println("Gumball Machine: " + machine.getLocation());
System.out.println("Current inventory: " + machine.getCount()
+ " gumballs");
System.out.println("Current state: " + machine.getState());
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
//
public class GumballMonitorTestDrive {
public static void main(String[] args) {
String[] location = { "rmi://santafe.mightygumball.com/gumballmachine",
"rmi://boulder.mightygumball.com/gumballmachine",
"rmi://seattle.mightygumball.com/gumballmachine" };
GumballMonitor[] monitor = new GumballMonitor[location.length];
for (int i = 0; i < location.length; i++) {
try {
// , Register , stub
GumballMachineRemote machine = (GumballMachineRemote) Naming
.lookup(location[i]);
monitor[i] = new GumballMonitor(machine);
System.out.println(monitor[i]);
} catch (Exception e) {
e.printStackTrace();
}
}
// ,
for (int i = 0; i < monitor.length; i++) {
monitor[i].report();
}
}
}
가상 에이전트
class ImageProxy implements Icon {
ImageIcon imageIcon;
URL imageURL;
Thread retrievalThread;
boolean retrieving = false;
// url ,
public ImageProxy(URL url) { imageURL = url; }
public int getIconWidth() {
if (imageIcon != null) {
return imageIcon.getIconWidth();
} else {
// ,
return 800;
}
}
public int getIconHeight() {
if (imageIcon != null) {
return imageIcon.getIconHeight();
} else {
return 600;
}
}
public void paintIcon(final Component c, Graphics g, int x, int y) {
if (imageIcon != null) {
// icon,
imageIcon.paintIcon(c, g, x, y);
} else {
g.drawString("Loading CD cover, please wait...", x+300, y+190);
if (!retrieving) {//
retrieving = true;
// ,
retrievalThread = new Thread(new Runnable() {
public void run() {
try {
// icon ,
imageIcon = new ImageIcon(imageURL, "CD Cover");
// , Swing
c.repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
});
retrievalThread.start();
}
}
}
}
public class ImageProxyTestDrive {
ImageComponent imageComponent;
JFrame frame = new JFrame("CD Cover Viewer");
JMenuBar menuBar;
JMenu menu;
Hashtable cds = new Hashtable();
public static void main(String[] args) throws Exception {
ImageProxyTestDrive testDrive = new ImageProxyTestDrive();
}
public ImageProxyTestDrive() throws Exception {
//
// , URL
Icon icon = new ImageProxy(initialURL);
//
imageComponent = new ImageComponent(icon);
frame.getContentPane().add(imageComponent);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setVisible(true);
}
URL getCDUrl(String name) {
try {
return new URL((String) cds.get(name));
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.